原文: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__
爲 null
。spa
接着由其衍生出第二神,另一個 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
因此你能夠看到,Object
、Function
、String
、Number
、Boolean
等等等的 __proto__
都是 Function.prototype
。對象
因此接下來的問題就更容易了,好比 Object instanceof Object
。前面咱們知道 Object.__proto__
是 %FunctionPrototype%,而它的 __proto__
是萬物之源 %ObjectPrototype%,剛好也是 Object.prototype
,因此就是 true
啦。blog
其它的也是同理,觸類旁通很簡單了。