當前位置:
首頁 > 知識 > 初始原型鏈學習

初始原型鏈學習

昨天,介紹了原型、原型鏈以及從一個實例化對象 cat 探尋原型鏈的秘密,今天我們從 Animal 出發,探究 Animal 所在的原型鏈。

Animal 的原型鏈

昨天我們通過代碼生成一個 Animal 類:

初始原型鏈學習

我們說對象都有__proto__屬性,那麼 Animal 也有啊!Animal 的原型是什麼?

不知道大家有沒有這樣在瀏覽器中試驗過:

初始原型鏈學習

初始原型鏈學習

對!就是這樣。一個函數的類型就是 function,那麼它應該是由 Function 構造而來。

也就是:Animal.__proto__ == Function.prototype

初始原型鏈學習

Function.prototype 是個對象,應該由 Object 構造,所以 Function.prototype.__proto__ == Object.prototype

初始原型鏈學習

最後,原型鏈的終點指向 null, Object.prototype.__proto__ == null

總結

對於 Animal 函數而言,其原型鏈上的關係有:

1. Animal 是一個函數,由 Function 構造,所以有:Animal.__proto__ == Function.prototype

2. Function.prototype是一個對象,由 Object 構造,所以有:Function.prototype.__proto__ == Object.prototype

3. 原型鏈的終點指向 null,所以有:Object.prototype == null

也就是:

Animal.__proto__.__proto__.__proto__ == null

圖示:

初始原型鏈學習

內置構造器對象與 Animal

js內置的構造器對象有12個(ES5中新加了JSON),可列舉的構造器的原型鏈結構同 Animal 一樣:

初始原型鏈學習

因為其實它們是js內置的構造對象, Animal 是我們自定義的構造對象,原理是一樣的。

prototype 和 __proto__

可以看到上圖中,Function 有 prototype 和 __proto__ 兩個屬性,它們有什麼區別呢?

__proto__是對象的屬性,而 prototype 是函數的屬性,萬物皆對象,函數也是對象,所以函數也有 __proto__ 屬性,但是不是所有對象都有 prototype 哦!

舉個例子:

初始原型鏈學習

看,我創建一個對象 obj, obj有__proto__, 卻沒有 prototype。

初始原型鏈學習

而我創建一個函數,這個函數就既有__proto__,也有 prototype。

有沒有既沒有__proto__也沒有 prototype的對象?有!

既沒有__proto__也沒有 prototype的對象

之前提到,通過 Object.create(null)生成一個沒有原型屬性的對象,這個對象就既沒有__proto__也沒有 prototype。

初始原型鏈學習

後記

這是我對原型鏈知識的一點理解和看法,如有錯誤的理解或表述,歡迎大家指出,接下來我會繼續探究原型鏈知識,請繼續關注初始原型鏈系列博文,感謝大家的支持!



2017優就業就業促進計劃:https://www.ujiuye.com/zt/jycj/?wt.bd=zt36716tt

中公教育「勤工儉學計劃」,給你一個真正0元學習IT的機會!

https://www.ujiuye.com/zt/qgjx/?wt.bd=zt36716tt

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

最簡單實用的JQuery實現banner圖中的text打字動畫效果!
何以解憂,唯有暴富!外媒盤點的十大最賺錢行業
asp.net MVC下使用rest的方法

TAG:IT優就業 |