一:在构造函数里面的属性和方法是不通过实例共享的;
function A() {
this.name = "睿睿",
this.fn=function(){
console.log(this.name)
}
}
var a = new A();
var b = new A();
//通过实例a修改构造函数本身的属性name值
a.name = "瑞瑞";
//发现只有实例a的name值发生变化,实例b没有发生变化;说明:在构造函数里面的属性和方法是不通过实例共享的;
console.log(a.name); //瑞瑞
console.log(a.fn()); //瑞瑞
console.log(b.name); //睿睿
console.log(b.fn()); //睿睿
二: 在构造函数的原型对象(prototype)里面的属性和方法,是所有的实例所共享的;
function A() {
this.name = "睿睿"
}
//往构造函数A的原型对象(prototype)里面添加name属性(prototype里面添加的name和构造函数里面的属性name不一样)
A.prototype.name = "张睿"
//A有俩个实例(a , b)
var a = new A();
var b = new A();
//此时,a和b同时访问A原型对象中的name属性,获取的是一样的;说明:在构造函数的原型对象(prototype)里面的属性和方法,是所有的实例所共享的;
console.log(a.__proto__.name); //张睿
console.log(b.__proto__.name); //张睿
总结:实例对象需要共享的属性和方法,都放在原型对象(prototype)里面;那些不需要共享的属性和方法,就放在构造函数里面。
(此话来源于阮一峰老师):由于所有的实例都共享原型对象(prototype)里面的属性和方法,所以看起来prototype就像是所有实例对象的原型,而实例对象就像是继承了peototype对象一样;
完!