JS原型鏈的一些理解

關于原型鏈我的理解是一個構造函數的原型作為另一個構造函數的實例形成的繼承關系
在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__:SuperPerson.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指向這么一說

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容