javascript - 为什么即使构造函数在其原型(prototype)链中,类的 instanceof 也会返回 false?

标签 javascript node.js instanceof

在 NodeJS 应用程序中,我试图检查传递给函数的值是否是特定类的实例,但是我在模块之间使用 instanceof 并在检查类的平等。

端点.js

import SomeClass from 'utils/class';
import SomeModel from 'models/model';

const model = SomeModel.findOne({id: 'abc'});
const values = {a: 'b'};
const classInstance = new SomeClass({id: 'def'});

classInstance instanceof SomeClass //returns true
Object.getPrototypeOf(classInstance) //returns SomeClass {}

model.update(values, { a: classInstance, b: SomeClass });

当 classInstance 传递给更新函数时,我看到了意外行为。

调用 Object.getPrototypeOf(a) 返回 SomeClass,a.constructor.name 也是如此。然而,a instanceof SomeClass 返回假。

此外,仅检查导入的类和传递给函数的类之间的相等性会返回 false。

require.resolve('utils/class') 为两个导入返回相同的路径。

模型/模型.js

import SomeClass from 'utils/class';

class Model {
  async update(values, injections) {
    const { a, b } = injections;

    // checking instance
    a.constructor.name //returns SomeClass
    Object.getPrototypeOf(a) //returns SomeClass {}
    a instanceof SomeClass; //returns false

    // checking class
    b === SomeClass; //returns false
  }
}

我希望 b === SomeClass 会返回 true,就像 a instanceof SomeClass 也应该返回 true 一样,除非我遗漏了什么。感谢您的帮助。

utils/class.js

export default class SomeClass {
  constructor(foo) {
    this.bar = foo;
  }
}

编辑:代码正在使用@std/esm 进行转译。 NODE_PATH=./src/nodemon -r @std/esm src/server.js

最佳答案

是否是由于 SomeClass 实例被多次定义(由于转译器等原因)?考虑这段将返回 false 的代码:

(function() {

    class Foo {};

    class Bar {
        check(a) {
            console.log(a instanceof Foo);
        }
    };

    window.bar = new Bar();

})();

(function() {
    class Foo {};
    const foo = new Foo();
    window.bar.check(foo);
})();

与 Foo、Bar 等相比,仅在全局范围内定义 1 次(require() 应缓存这些依赖项,因此您不应遇到此行为):

class Foo {};

class Bar {
    check(a) {
        console.log(a instanceof Foo);
    }
};

const foo = new Foo();
Bar.prototype.check(foo);

有一个 issue在有人遇到同样事情的 std/esm 项目上。我不使用那个库,所以不知 Prop 体细节。

否则我可能离题太远了。

关于javascript - 为什么即使构造函数在其原型(prototype)链中,类的 instanceof 也会返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522581/

相关文章:

javascript - 带星号的正则表达式电话号码

java - 如何摆脱 instanceof?

java - 在 Stream 中为 Instanceof 应用模式匹配

javascript - 循环 json 对象并将值添加到现有 UL 元素

javascript - Grunt Uglify - 如何创建用于调试的源映射?

javascript - 如何检查 Node js 中的数据类型——特别是整数

javascript - 如何通过javascript下载pdf文件?

javascript - 推送时获取 Firebase UID,然后在 Java 中使用给定的 UID 再次推送

node.js - 终止 Faye 客户端连接

java - 通过instanceof使用数组的元素