为什么Object.prototype instanceof Object是false?

8
为什么以下代码返回false?
Object.prototype instanceof Object

1
因为Object.prototype不是由Object()函数创建的。 - Aravind
1
但有趣的是,Object.prototype.toString() === "[object Object]" - soktinpk
1
@Aravind:Function也不是,但是它是Object的实例。 - Bergi
@Paul Draper:为什么会让人感到困惑呢?这只是对象的“类型”(就语言而言),而不是它的祖先名称。 - zerkms
@zerkms,因为两者似乎都在问:“嘿,这是一个对象吗?”当然,这种行为有一个严谨的解释,但JS类型通常很令人困惑(“那是一个数字吗?不,那是一个Number。巨大的区别。”),而这是这样一个情况。 - Paul Draper
显示剩余9条评论
2个回答

11

这段内容基本上是在询问 Object.prototype 是否继承自 Object.prototype 对象:事实并非如此。

a instanceof b 等同于 b.prototype.isPrototypeOf(a) - 它测试了 b.prototype 是否在 a 的原型链中。在您的情况下,它不在该链中,因为它是链的起点本身。 isPrototypeOf 不是自反的。


兄弟,你有没有一篇关于OLOO和New等以及原型等方面观点的博客?我喜欢你的表达和解释方式,非常简练。有你的网站可以阅读吗? - james emanon
1
@jamesemanon:还没有。但是你可以浏览我的SO答案,当然是关于这个话题的 :-) - Bergi
@jamesemanon:说实话,我以前从未听说过 OLOO 这个术语,不得不通过谷歌搜索了解它。但是,是的,在JS中似乎应该(或者说我应该)使用这种思维模式。我喜欢它的通用性,类的概念可以通过它轻松实现。使用构造函数和 new 只是语法糖(就像ES6类一样,但具有更“常见”的语法)。 - Bergi
@Bergi 我对你的回答感到困惑。我认为在你的特定示例中,你想说的是 b instanceof a 而不是 a instanceof b - Bhojendra Rauniyar
@BhojendraNepal:不,这就是我的意思。a是实例,b是构造函数。 - Bergi

0

参考MDN

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接