这对我来说没有意义,请有人解释它的最后一行:
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的官方部分,所以我看了看它)
答案 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)可能是一个很大的挑战。我推荐你介绍一些解释得很好的文章,但遗憾的是,到目前为止我还没有发现任何内容 - 阅读规范可能会让你更加困惑(它不是有更好的规格)。