昨天,介紹了原型、原型鏈以及從一個實例化對象 cat 探尋原型鏈的祕密,今天咱們從 Animal 出發,探究 Animal 所在的原型鏈。javascript
Animal 的原型鏈java
昨天咱們經過代碼生成一個 Animal 類:git
function Animal( name){ this.name = name; this.say = function (){ console.log("hello cat!"); } }
咱們說對象都有__proto__屬性,那麼 Animal 也有啊!Animal 的原型是什麼?github
不知道你們有沒有這樣在瀏覽器中試驗過:瀏覽器
function A(){} typeof A
對!就是這樣。一個函數的類型就是 function,那麼它應該是由 Function 構造而來。函數
也就是:Animal.__proto__ == Function.prototypethis
Function.prototype 是個對象,應該由 Object 構造,因此 Function.prototype.__proto__ == Object.prototype es5
最後,原型鏈的終點指向 null, Object.prototype.__proto__ == nullprototype
總結3d
對於 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。
後記
這是我對原型鏈知識的一點理解和見解,若有錯誤的理解或表述,歡迎你們指出,接下來我會繼續探究原型鏈知識,請繼續關注初始原型鏈系列博文,感謝你們的支持!
如需轉載,請指明出處,素質轉載,謝謝。