一、構造函數內定義的屬性/方法
function Fn(name){
this.name=name;
};
var a = new Fn('張三');
var b = new Fn('李四');
console.log(a.name)//張三
console.log(b.name)//李四
可以看出:構造函數內定義的屬性/方法,對實例來說是不共享的,每一個實例都有各自的一份。互不影響!!
二、被繼承的原型對象中屬性/方法
function Fn(name){
this.name=name;
};
Fn.prototype.age='13'
var a = new Fn('張三');
var b = new Fn('李四');
console.log(a.name)//張三
console.log(b.name)//李四
console.log(a.age)//13
console.log(b.age)//13
可以看出:被繼承的原型對象中屬性/方法是共享的,所有實例全可以共享其構造函數中原型對象的屬性/方法;
誤導
function Fn(name){
this.name=name;
};
Fn.prototype.age='13'
var a = new Fn('張三');
var b = new Fn('李四');
Fn.prototype={
url:'www.baidu.com'
}
console.log(a.name)//張三
console.log(b.name)//李四
console.log(a.age)//13
console.log(b.age)//13
console.log(a.url)//undefined
console.log(b.url)//undefined
既然原型對象屬性共享,那麼爲什麼整體置換了原型對象的時候不應該打印下面那種情況嗎?爲什麼不是呢?
console.log(a.name)//張三
console.log(b.name)//李四
console.log(a.age)//undefined
console.log(b.age)//undefined
console.log(a.url)//www.baidu.com
console.log(b.url)//www.baidu.com
原因是:在置換構造函數的原型對象的時候,實例a和實例b已經創立了;
此時:a 和 b 的 _proto_指向的是之前的原型對象;現在的原型對象實質就是將prototype指向一個新的對象;和之前的原型對象沒有關係!
如果寫成這樣,那就是你想的那樣子了!
function Fn(name){
this.name=name;
};
Fn.prototype.age='13'
Fn.prototype={
url:'www.baidu.com'
}
var a = new Fn('張三');
var b = new Fn('李四');
console.log(a.name)//張三
console.log(b.name)//李四
console.log(a.age)//undefined
console.log(b.age)//undefined
console.log(a.url)//www.baidu.com
console.log(b.url)//www.baidu.com
那如果既想把置換原型的方法寫在創造實例之後,又想成功置換,該怎麼辦呢?很簡單 只需要通過_proto_把指針指向新的原型對象即可!
請看代碼↓
function Fn(name){
this.name=name;
};
Fn.prototype.age='13'
var a = new Fn('張三');
var b = new Fn('李四');
Fn.prototype={
url:'www.baidu.com'
}
//實例通過__proto__把指針指向新置換的原型對象
a.__proto__=Fn.prototype;
b.__proto__=Fn.prototype;
console.log(a.name)//張三
console.log(b.name)//李四
console.log(a.age)//undefined
console.log(b.age)//undefined
console.log(a.url)//www.baidu.com
console.log(b.url)//www.baidu.com
完!
如理解有誤,請評論區指出,立馬改正!謝謝