前端JS原型、原型鏈

原型和原型鏈是前端比較重要的概念,也比較繞,很多人都搞不明白。剛好今天有人問我索性就寫篇文章整理一下。

首先來說一下什麼是原型、原型鏈和構造函數。

原型:JS中的對象都包含了一個prototype的內部屬性,這個屬性所對應的就是該對象的原型。

原型鏈:原型鏈是是有一些用來繼承和共享屬性的對象組成的對象鏈。並且原型鏈的長度是有限的。

構造函數:原型對象包含一個constructor屬性,對應創建所有指向該原型的實例的構造函數。  

接下來說一下 prototype 和 _proto_

所有對象都有_proto_屬性指向該對象的原型。

所有函數對象除了有_proto_屬性之外還有prototype屬性。因爲函數也是對象,所以有_proto_,但同時函數這一對象類型比較特殊,所以還有prototype。

下面舉個栗子?

var p = new person() ;
p._proto_=person.prototype

當一個函數被用作構造函數創建實例的時候,該函數的prototype屬性值作爲原型負值給它創建出來的實例對象。也就是說構造函數的prototype和他所實例化出來的對象的_proto_是相同的。(如上例所示)

所有的原型對象都有constructor屬性,這個屬性對應 創建所有指向該原型的實例的構造函數。

 

//所有的構建函數比如Function、Object、Number等等都是函數對象,比如你var obj=new Object()
console.log(typeof Object);//function

Object.prototype=Object{}
Object.prototype.constructor=Object函數
Object.prototype._proto_=null

上面那段代碼可能比較難以理解,大家耐心多理解幾遍就會豁然開朗。 

原型鏈其實就是繼承鏈,首先在這個對象的自身查找,如果沒有該屬性,就在其原型鏈上一層一層向上查找,如果查到原型鏈的頂端也沒有該屬性,那麼就返回undefined。

如何判斷一個屬性是自身的還是原型鏈上的?

obj.hasownProperty('name'); //返回true和false

 

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