關于原型鏈我的理解是一個構造函數的原型作為另一個構造函數的實例形成的繼承關系
在JS高級程序設計中有這樣一個圖
圖片來源于JS高級程序設計
當我們定義一個函數時會有一個原型,即圖中的SuperType Prototype,這時原型對象中會有一個constructor指向構造函數SuperType,這便是構造函數與原型對象之間的關系;
function Super(){
this.name='bob';
this.age=20;
}
此時如果再定義一個SubType構造函數,把SubType prototype作為構造函數SuperType的實例,便會有[[Prototype]]指向SuperType Prototype這樣便形成了原型鏈,注意SubType Prototype已經沒有constructor
function Super(){
this.name='bob';
this.age=20;
}
function Person(){};
Person.prototype = new Super();
原型鏈中的繼承
上面代碼中Person構造函數和prototype里什么也沒定義,但是我們現在對Person進行實例,事實上我們是可以取到值的
var person = new Person();
console.log(person.name); //'bob'
console.log(person.age); //20
通過chrome控制臺的打印我們可以發現這種繼承關系,__prototo__:Super
由Person.prototype = new Super();
存在Super中的屬性;
image.png
constructor指向變化
JS高級程序設計說如果一個構造函數的原型對象作為另一個構造函數的實例,那么作為實例的原型對象的constructor就會消失,從上圖中我們也能發現綠色框中沒有constructor屬性,這里當時我在想如果直接手動將constructor指為Person這個構造函數原型鏈是否會斷裂
function Super(){
this.name='bob';
this.age=20;
}
function Person(){};
Person.prototype = new Super();
Person.prototype.constructor = Person;
console.log(Person.prototype);
var person=new Person();
console.log(person);
通過在控制臺中打印可以發現constructor這里只作為一個屬性,值為Person這個構造函數,而真正的影響指向的constructor為灰色
image.png
因此可以推斷不存在手動更改constructor指向這么一說