在我看來,原型鏈中有兩條特別難以理解的原型鏈,一個是 Function 的原型鏈,一個是 Object 的原形鏈。 Function 的原型鏈 首先,看下 Function 的原型鏈的圖示: 看起來就不是一般的鏈! 對, 對於 Function 來說最難理解的就是 Function.__proto_ ...
在我看來,原型鏈中有兩條特別難以理解的原型鏈,一個是 Function 的原型鏈,一個是 Object 的原形鏈。
Function 的原型鏈
首先,看下 Function 的原型鏈的圖示:
看起來就不是一般的鏈!
對, 對於 Function 來說最難理解的就是 Function.__proto__ == Function.prototype 了,也就是 Function的原型是 Function 。
Function的原型是 Function 這是啥意思?
首先,所有的函數都來自於 Function.prototype,舉個例子:
看到沒?所有的函數的原型都是 Function.prototype
Function是一個函數,既然是函數,那麼它的原型都是 Function.prototype。
小結
Function 原型鏈具有以下關係:
1. Function也是一個函數,既然是函數,那麼它就應該被 Function 也就是其自身構造:Function.__proto__ == Function.prototype;
2. Function.prototype是一個對象,由 Object 構造,所以有: Function.prototype.__proto__ == Object.prototype;
3. 原型鏈的終點指向 null,Object.prototype.__proto__ == null;
也就是:
Function.__proto__.__proto__.__proto__ == null;
Object的原型鏈
Object的原型鏈也是難以理解的重點部分,直接上圖:
看這圖,成功組成了一個閉合迴路啊!Object 和 Function 形成了錯綜複雜的關係。讓我們慢慢分析,請聽我娓娓道來。
首先 Object 是一個構造函數,為什麼這麼說?舉個例子:
這樣,我們通過 Object 構造了一個字元串對象,所以說 Object 是一個構造函數,上面說過,既然是函數,那麼它的原型都是 Function.prototype。
所以:Object.__proto__ == Function.prototype。
對於 Function.prototype,我們都知道了,他是一個對象嘛, 所以 Function.prototype.proto == Object.prototype。
最後,原型鏈的定義中提到,原型鏈的終點指向 null 。所以, Object.prototype.__proto__ 應該指向 null。
Object 和 Function 跟換孩子似的真的好麽?
小結
最後總結 Object 的原型鏈具有以下關係:
1. Object 是一個構造函數,既然是函數,那麼它就應該被 Function構造:Function.__proto__ == Function.prototype;
2. Function.prototype是一個對象,由 Object 構造,所以有: Function.prototype.__proto__ == Object.prototype;
3. 原型鏈的終點指向 null,Object.prototype.__proto__ == null;
也就是:
Object.__proto__.__proto__.__proto__ == null;
所以就有了這樣的圖:
後記
這是我對原型鏈知識的一點理解和看法,如有錯誤的理解或表述,歡迎大家指出,接下來我會結合原型介紹 js 的繼承。請大家多多支持!
如需轉載,請指明出處,素質轉載,謝謝。