【问题标题】:JavaScript instanceof operator returning true when should be false?JavaScript instanceof 运算符何时返回 true 应该为 false?
【发布时间】:2025-12-27 07:40:12
【问题描述】:

我在开发一个 JavaScript 应用程序时遇到了这种奇怪的行为。
谁能给我解释一下原因

function BaseClass() {}
function ClassOne() { this.bar = "foo"; }
function ClassTwo() { this.foo = "bar"; }

var base = new BaseClass();
ClassOne.prototype = base;
ClassTwo.prototype = base;

var one = new ClassOne();
var two = new ClassTwo();
one instanceof ClassTwo && two instanceof ClassOne;
// The line above will return true, but i think it should return false,
// because obviously one is not an instance of ClassTwo!

【问题讨论】:

    标签: javascript function new-operator prototype instanceof


    【解决方案1】:

    onetwo 都具有相同的原型(构造函数 BaseClass)。 Object.getPrototypeOf(one) === Object.getPrototypeOf(two).

    不要在base 中“回收”new BaseClass,而是使用:

    // var base = new BaseClass(); <-- No!
    ClassOne.prototype = new BaseClass();
    ClassTwo.prototype = new BaseClass();
    

    【讨论】:

    • 这是真的,虽然 T.J.克劳德前几天回答了一个问题,详细解释了为什么这不一定是最好的做事方式。我看看能不能找到。
    • +1 很好的答案。这是一个非常棘手的问题,我以前也发现过!
    • 是的@RobW 就是这样。此外,T.J 的小图书馆看起来也很棒。
    • 是的,在我注意到这个问题之后,我实际上将我的代码修复为为每个子类使用一个新的 BaseClass。链接的帖子谈到了在未继承的基类原型上定义的函数,这与我的问题不同。
    • @Sense545 参见规范:The instanceof operator[[HasInstance]]:“如果 O 和 V 引用同一个对象,则返回 true。” (例如:O=One.prototype,V=ClassOne 原型链中的任何原型)。 Q:“是什么让 instanceof 认为 one 是 ClassTwo 的 instanceof”。 A:oneClassOne的一个实例,其原型与ClassTwo的原型完全相同。
    最近更新 更多