深度理解原型鏈

2021-07-14 04:19:49 字數 2231 閱讀 3273

prototype

prototype是建構函式的屬性,指的就是建構函式的原型,在生成例項的時候,js會根據建構函式的prototype屬性將該屬性下的物件生成為父類,

注意,只有建構函式這個屬性才有這種效果哦~如果乙個建構函式沒有指定該屬性,那麼該屬性下的__proto__會預設的指向原生object的原型物件,該屬性會變成乙個物件,其中constructor屬性指向本身。

​constructor

constructor,如果通俗的理解,可以理解成原型物件的建構函式,當把乙個物件(物件字面量)賦給乙個建構函式的原型,constructor 會被複寫,如果沒有進行prototype的操作的話,constructor是函式宣告時指定的,指定為本身:

例如:

function a() {}  

則 a.prototype.constructor === a; 但是這個屬性往往是不準確的:

function a() {}

function b() {}

b.prototype = new a();

​ var b = new b();

b.constructor; // a

上面的**,按照constructor的含義,b的constructor應該指向b,但是確指向了a,原因如下

a沒有進行prototype操作,所以其constructor指向本身; b.prototype = new a();  

之後b.prototype.constructor === a;         b.prototype被複寫為a的例項,b.prototype.constructor === a;  

而b是b的例項則b.constructor === a;

如果想要實現繼承,一般要進行constructor修復,即:  b.prototype = new a();  b.prototype.constructor = b;

__proto__

​可以這麼說,js的原型鏈就是通過這個屬性串聯起來的,__proto__屬性指向他的父類,在呼叫乙個物件的屬性或者方法的時候就是通過__proto__這一屬性指向的物件一層一層的向上查詢的。上面的一句:

在生成例項的時候,js會根據建構函式的prototype屬性將該屬性下的物件生成為父類,在這裡可以改為,在生成例項的時候,js會根據建構函式的prototype屬性將該屬性下的物件引用到例項的__proto__屬性下

我們首先來說說繼承,繼承是物件導向語言的重要機制,通俗地講就是子類可以擁有父類的方法和屬性,js的原型鏈實際上也是一種繼承,在ecmascript標準中,只支援實現繼承,而其實現實現繼承就是主要依靠於原型鏈實現的。

那麼,我們再來說說原型,原型其實就是上述所說的繼承中的父類。

這樣,原型鏈 顯而易見的 可以理解為,利用原型串起乙個繼承鏈,讓乙個引用型別繼承另乙個引用型別的屬性和方法,再以此類推下去.

​這三者的關係用一句話概括為,每個建構函式都有乙個原型,當new 乙個建構函式的時候就會生成乙個原型鏈上攜帶該建構函式的原型的例項。

function parent() 

parent.prototype =

function temp()

temp.prototype = new parent();

var child = new temp();

console.log(child.a +" " + child.b+child.c);//hello world!​​​​​​

上面的**執行結果就為 : 「hello world!」生成的原型鏈即是

child(temp的例項) > __proto__ > temp.prototype(parent的例項) > __proto_ >parent.prototype > __proto__ > object.prototype >__proto__ > null

function extend(child, parent) 

temp.prototype = parent.prototype;

child.prototype = new temp();

​}

extend函式 兩個引數都為建構函式,目的是讓乙個建構函式(子類)繼承另乙個建構函式(父類)的原型,並且不呼叫父類的建構函式(有時候建構函式會需要一些引數或者做一些事情破壞了原型鏈),這個方法可以用來生成想要的原型鏈哦。​

js 原型 原型鏈理解

執行發現如下 自定義乙個函式,函式包含兩個關鍵資料 prototype,proto 1 原型 prototype person具有prototype屬性 包含我們定義的屬性name,age以及constructor,並且constructor指向我們的person函式,可以理解為prototype就...

原型與原型鏈深度學習

1.函式物件的 prototype 屬性 我們建立的每乙個函式都有乙個 prototype 屬性,這個屬性是乙個指標,指向乙個物件。該函式例項化的所有物件的 proto 的屬性指向這個物件,它是該函式所有例項化物件的原型。建構函式 2.constructor屬性 當函式建立,prototype 屬性...

理解js原型和原型鏈

一.普通物件和函式物件 js中,萬物皆物件,大體分為兩種 普通物件,函式物件。凡是通過new function 建立的都是函式物件,其他的則為普通物件。下面舉例說明 function fun1 function var fun2 function function var fun3 new func...