prototype 與 __proto__ 的愛恨情仇

原文:https://blog.crimx.com/2017/0...javascript

經歷了上次的《JavaScript This 的六道坎》 發現編故事有點上癮,並且記憶效果也不錯哈哈,今天繼續嘮叨一下 prototype__proto__ 的愛恨情仇。java

先理解二者的一個本質區別,prototype 是函數獨有的,是人爲設定的;__proto__ 是全部對象都有的,是繼承的。函數

而後來看一個兩個神的故事:this

首先在 ECMAScript 星球,萬物起源於 the Engineers,哦不,是一個叫 %ObjectPrototype% 的 intrinsic object,也就是 Object.prototype。它是萬物的盡頭,繼承於虛無, Object.prototype.__proto__nullspa

Object.prototype

接着由其衍生出第二神,另一個 intrinsic object %FunctionPrototype%,也就是 Function.prototype。因而有prototype

Function.prototype.__proto__ === Object.prototype // true

Function.prototype 自己也是個函數對象,這是爲了兼容 ES5。也估計是讓人引發誤解的源頭。但二者仍是不一樣的,這是個特殊的函數對象,它忽略參數老是返回 undefined,且沒有 [[Construct]] 內部方法。3d

搞清楚了這兩個 Ancient Gods 接下來就很容易了,相信也聽過「函數在 JS 裏是一等公民」這類的說法,實際上是由於它們都是 %FunctionPrototype% 的子民(這裏不用 Function.prototype 是爲了不混淆,記得 prototype 是人爲設定的),包括 Function 自己。code

因此你能夠看到,ObjectFunctionStringNumberBoolean 等等等的 __proto__ 都是 Function.prototype對象

因此接下來的問題就更容易了,好比 Object instanceof Object。前面咱們知道 Object.__proto__ 是 %FunctionPrototype%,而它的 __proto__ 是萬物之源 %ObjectPrototype%,剛好也是 Object.prototype,因此就是 true 啦。blog

其它的也是同理,觸類旁通很簡單了。

相關文章
相關標籤/搜索