初始原型鏈學習
昨天,介紹了原型、原型鏈以及從一個實例化對象 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
※最簡單實用的JQuery實現banner圖中的text打字動畫效果!
※何以解憂,唯有暴富!外媒盤點的十大最賺錢行業
※asp.net MVC下使用rest的方法
TAG:IT優就業 |