一:在構造函數裏面的屬性和方法是不通過實例共享的;
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對象一樣;
完!