ste*_*ick 8 javascript instanceof node.js
在NodeJS应用程序中,我试图检查传递给函数的值是否是特定类的实例,但是我instanceof在模块之间使用以及检查类的相等性时会遇到意外行为.
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 });
Run Code Online (Sandbox Code Playgroud)
当classInstance传递给更新函数时,我看到了意外的行为.
调用Object.getPrototypeOf(a)返回SomeClass,也是如此a.constructor.name.但是,a instanceof SomeClass
返回false.
此外,只检查导入的类和传递给函数的类之间的相等性返回false.
require.resolve('utils/class') 为两个导入返回相同的路径.
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
}
}
Run Code Online (Sandbox Code Playgroud)
我希望它b === SomeClass会返回true,就像a instanceof SomeClass应该返回true一样,除非我遗漏了一些东西.谢谢你的帮助.
export default class SomeClass {
constructor(foo) {
this.bar = foo;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:使用@ 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);
})();
Run Code Online (Sandbox Code Playgroud)
与 Foo、Bar 等相比,仅在全局范围内定义了 1 次(require()应该缓存这些依赖项,因此您不应该遇到这种行为):
class Foo {};
class Bar {
check(a) {
console.log(a instanceof Foo);
}
};
const foo = new Foo();
Bar.prototype.check(foo);
Run Code Online (Sandbox Code Playgroud)
std/esm 项目存在一个问题,有人遇到了同样的事情。我不使用该库,所以对具体细节没有想法。
或者我可能会走得很远。