在 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/