原型和原型鏈是前端比較重要的概念,也比較繞,很多人都搞不明白。剛好今天有人問我索性就寫篇文章整理一下。
首先來說一下什麼是原型、原型鏈和構造函數。
原型: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