为什么{} __ proto__ instanceof!== Object

时间:2015-11-09 08:49:25

标签: javascript

这对我来说没有意义,请有人解释它的最后一行:

var o = {};
o.__proto__.isPrototypeOf(Object)  // true
o.__proto__.constructor.name       // 'Object'
o.__proto__.toString()             // '[object Object]'
o.__proto__ instanceof Object      // false (wtf???)

让我重新解释一下我原来的问题 - 我不是在寻找理解内部如何工作但是为什么它以这种方式工作(尽管有时它有帮助) - 我的意思是:为什么JS引擎构建dunder proto( __proto__)作为一个对象,它不是Object EVEN的实例,如果它有'constructor'设置AND,即使所有对象文字都是Object的实例(例如o instanceof Object === true({}) instanceof Object === true)。< / p>

换句话说 - 当dunder proto不是手动构建时, WHAT 的instanceof是dunder proto?

为什么它有“构造函数”属性设置如果“它不是实例”,就像有人写的那样?根据MDN:“所有对象都从其原型继承构造函数属性” - 如果dunder proto对象具有构造函数属性,那么它应该意味着它是从'some'原型继承的......所以,如果'constructor'属性对我有意义没有为'root'dunder proto设置

(我没有使用dunder proto,因为它被劝阻但昨天我读了它是ES6的官方部分,所以我看了看它)

1 个答案:

答案 0 :(得分:3)

instanceof执行一些簿记,然后执行HasInstance&#34;方法&#34;。

HasInstance定义为:

  

返回一个布尔值,指示参数是否可能是此对象构造的Object。

由于您的对象的原型未构造,因此在使用instanceof时必须始终返回false。相比之下,

o instanceof Object

返回true,因为o 是一个实例。

这实际上如何运作?好吧,HasInstance遍历它正在检查的对象的整个prototype链。但是o.__proto__ 没有原型 - 所以它不被视为对象,HasInstance返回false。

如果你习惯于处理基于类的OOP语言,那么Javascript的OOP(/ FP:P)可能是一个很大的挑战。我推荐你介绍一些解释得很好的文章,但遗憾的是,到目前为止我还没有发现任何内容 - 阅读规范可能会让你更加困惑(它不是有更好的规格)。