在我看來,原型鏈中有兩條特別難以理解的原型鏈,一個是 Function 的原型鏈,一個是 Object 的原形鏈。函數
Function 的原型鏈prototype
首先,看下 Function 的原型鏈的圖示:3d
看起來就不是通常的鏈!對象
對, 對於 Function 來講最難理解的就是 Function.__proto__ == Function.prototype 了,也就是 Function的原型是 Function 。blog
Function的原型是 Function 這是啥意思?繼承
首先,全部的函數都來自於 Function.prototype,舉個例子:原型鏈
看到沒?全部的函數的原型都是 Function.prototype字符串
Function是一個函數,既然是函數,那麼它的原型都是 Function.prototype。原型
小結io
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 的繼承。請你們多多支持!
如需轉載,請指明出處,素質轉載,謝謝。