構造函數的屬性和方法

一、構造函數內定義的屬性/方法
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

完!
如理解有誤,請評論區指出,立馬改正!謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章