浅谈javascript prototype constructor

本文详细解析了JavaScript prototype的概念、作用以及如何通过prototype实现对象共享属性。通过具体实例,展示了如何利用prototype修改对象属性,以及constructor属性的作用。文章还探讨了特殊情况下的prototype引用改变对属性的影响,并提供了解决方法。
谢谢大家观看我的博客,接下来讲讲javascript prototype相关的内容,本人知识有限,希望有误的地方请多多指教!
prototype可以概括为几句:
prototype相当于java对象中的一个静态属性,所以每个新生成的对象都共有这个prototype属性,如果对prototype做相应的修改,新生对象--地址引用的属性(比如Array,{})都会有影响,而对于值引用的属性不会有影响(比如String,int).
实例:

function ClassA(){ }

function Pro(){

this.p1 = 'p1';

this.fun1 = function(){
console.log('fun1');
};

this.arr = [];
}

var pro = new Pro()
ClassA.prototype = pro;

var a1 = new ClassA();
var a2 = new ClassA();//a1,a2共享prototype(pro)属性

a1.p1 = 'a1p1';
console.log('a1.p1='+a1.p1+'| a2.p1='+a2.p1);//这里是值引用所以a1.p1的改变不会影响a2.p1

a1.arr.push(1,2,3);
console.log('a1.arr='+a1.arr+'| a2.arr='+a2.arr);//这里是地址引用,所以a1.arr的改变会影响a2.arr


关于constructor,我有两句话要说:1、constructor属性始终指向创建当前对象的构造函数。 2、每个函数都有一个默认的属相prototype,而这个prototype的constructor指向该函数。

//constructor属性始终指向创建当前对象的构造函数
//---每个函数都有一个默认的属性prototype,而这个prototype的constructor指向这个函数
console.log('--Example_One--');
var Person = function(name){
this.name = name;
};

Person.prototype.getName = function(){
return this.name;
}

var p = new Person('zhang');

console.log(Person.constructor === Function); //true 创建Person对象的是Function
console.log(p.constructor === Person); //true 创建p的是Person
console.log(Person.prototype.constructor === Person);//true 函数prototype的constructor指向本函数
console.log(p.constructor.prototype.constructor === Person);//true 根据上述关系得出的等式

//特殊情况如果函数prototype的引用对象被改变,上述情况将不再存在
console.log('---Example_Two---');
var Student = function(name){
this.name = name;
};

Student.prototype = {
getName:function(){
return this.name;
}
}

var s = new Student('zhen');

console.log(Student.constructor === Function );
console.log(s.constructor === Student);
console.log(Student.prototype.consturctor === Student);
console.log(s.constructor.prototype.constructor === Student);

//以上情况的解决办法

console.log('---Example_Three---');
var Animal = function(name){
this.name = name;
};

/*
Animal.prototype = {
getName:function(){
return this.name;
}
}
*/
Animal.prototype = new Object(
{
getName:function(){
return this.name;
}
}
);

Animal.prototype.constructor = Animal; //重新覆盖prototype的constructor

var a = new Animal('zhen');

console.log(Animal.constructor === Function );
console.log(a.constructor === Animal);
console.log(Animal.prototype.constructor === Animal);
console.log(a.constructor.prototype.constructor === Animal);


如有不对请大家不吝赐教!
JavaScriptprototypeconstructorJavaScript中的两个概念,用于实现对象的继承和构造。 prototype(原型)是JavaScript中每个对象都有的一个属性,它指向该对象的原型(即父对象)。每个函数都有一个prototype属性,它是一个指向该函数的原型对象的指针。通过修改prototype,可以给该函数的实例对象添加新的属性和方法。这样,函数的实例对象就可以共享这些属性和方法,从而实现了对象的继承。 constructor(构造函数)是一个指向创建该对象的函数的指针。每个对象都有一个constructor属性,它指向该对象的构造函数。通过Constructor属性,我们可以追踪一个对象是由哪个构造函数创建的,以便在需要时通过构造函数进行实例化。 通过prototypeconstructor的结合使用,可以在JavaScript中实现对象的继承和构造。具体的步骤如下: 1. 创建一个构造函数,并定义其原型对象中的属性和方法。 2. 使用new关键字实例化一个对象。 3. 通过对象的constructor属性,可以确定对象是由哪个构造函数创建的。 4. 进一步修改构造函数的原型对象,可以为所有实例对象添加新的属性和方法。 JavaScript中的原型继承和构造函数是基于原型链的概念。通过在对象之间共享属性和方法,可以实现更高效的内存使用和代码复用。prototypeconstructor提供了一种灵活而强大的方式来创建和继承对象,它们是JavaScript中非常重要的概念。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值