繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM