为啥 Object.prototype instanceof Object 是假的?

Posted

技术标签:

【中文标题】为啥 Object.prototype instanceof Object 是假的?【英文标题】:Why is Object.prototype instanceof Object false?为什么 Object.prototype instanceof Object 是假的? 【发布时间】:2015-01-13 18:00:26 【问题描述】:

为什么下面的返回false?

Object.prototype instanceof Object

【问题讨论】:

因为 Object.prototype 不是由 Object() 函数生成的 但有趣的是,Object.prototype.toString() === "[object Object]" @Aravind: Function 也不是,而是instanceof Object 这也令人困惑,因为typeof Object.prototype"object" @Paul Draper:为什么会让人困惑?它只是对象的type(就语言而言),而不是其祖先名称。 【参考方案1】:

因为它基本上询问Object.prototype 是否确实从Object.prototype 对象继承:它没有。

a instanceof b 等价于b.prototype.isPrototypeOf(a) - 它测试b.prototype 是否在a 的原型链中。在您的情况下,它不是 in 链,因为它是链本身的开始。 isPrototypeOf 不是反身的。

【讨论】:

兄弟 - 你有没有博客来解释你对 OLOO 与 New 等以及原型等的感受。我喜欢你表达/解释的方式。非常简洁。我可以阅读您的任何网站吗? @jamesemanon:没有(还没有)。不过你可以浏览my SO answers on the topic of course :-) @jamesemanon:老实说,我以前从未听说过OLOO 这个词,我不得不在谷歌上搜索它。但是,是的,这似乎是您应该(或:我确实)在 JS 中使用的思想模型。我喜欢它的通用性,类的概念可以通过它轻松实现。使用构造函数 & new 只是语法糖(就像 ES6 类一样,但具有更“通用”的语法) @Bergi 我对您的回答感到困惑。我想你想说b instanceof a 而不是a instanceof b 在你的具体例子中。 @BhojendraNepal:不,这就是我的意思。 a 是实例,b 是构造函数。【参考方案2】:

引用MDN:

instanceof 运算符测试对象是否在其原型中 链接构造函数的prototype 属性。

【讨论】:

以上是关于为啥 Object.prototype instanceof Object 是假的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ES5 Object 方法没有添加到 Object.prototype 中?

为啥使用 Object.prototype.hasOwnProperty.call(myObj, prop) 而不是 myObj.hasOwnProperty(prop)?

js中.__proto__既然是存在于内置的 Object.prototype 中不存在与对象中为啥console.log能打印出来?

Object.prototype.__proto__ Object.prototype和 Object.prototype.constructor

Object----Object.prototype.toString.call()方法的使用

Object.hasOwn 替换掉 Object.prototype.hasOwnProperty