[英]why {}__proto__ instanceof !== Object
这对我来说没有意义,请有人解释它的最后一行:
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__
proto __proto__
)AS一个不是实例的对象对象即使它有'构造函数'设置,即使所有对象文字都是对象的实例(例如, o instanceof Object === true
, ({}) instanceof Object === true
)。
换句话说 - 当dunder proto不是手动构建时, WHAT的实例是dunder proto?
为什么它有“构造函数”属性设置,如果“它不是一个实例”,就像有人写的那样? 根据MDN:“所有对象都从其原型继承构造函数属性” - 如果dunder proto对象具有构造函数属性,那么它应该意味着它是从'some'原型继承的......所以,如果'constructor'属性对我有意义没有为'root'dunder proto设置
(我没有使用dunder proto,因为它被劝阻但昨天我读了ES6的官方部分,所以我看了一下)
instanceof
做了一些簿记,然后执行HasInstance
“方法”。
HasInstance
定义为:
返回一个布尔值,指示参数是否可能是此对象构造的Object。
由于未构造对象的原型,因此在使用instanceof
时必须始终返回false。 相反,
o instanceof Object
返回true,因为o
是一个实例。
这实际上是如何工作的? 好吧, HasInstance
遍历它正在检查的对象的整个prototype
链。 但o.__proto__
没有原型 - 因此它不被视为对象, HasInstance
返回false。
如果你习惯于处理基于类的OOP语言,那么Javascript的OOP(/ FP:P)可能是一个很大的挑战。 我会向你推荐一些解释得很好的文章,但遗憾的是,到目前为止我还没有找到 - 并且阅读规范可能会让你更加困惑(这不是那里更好的规范之一)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.