在NodeJS应用程序中,我试图检查传递给函数的值是否是特定类的实例,但是我在模块之间使用instanceof以及检查类的相等性时会遇到意外行为.
endpoint.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)和a.constructor.name一样返回SomeClass.但是,SomeClass的一个实例
返回false.
此外,只检查导入的类和传递给函数的类之间的相等性,返回false.
require.resolve(‘utils / class’)为两个导入返回相同的路径.
车型/ model.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,就像someClass的instanceof也应该返回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); })();
vs Foo,Bar等,只在一次全局范围内定义(require()应该缓存这些依赖关系,因此你不应该遇到这种行为):
class Foo {}; class Bar { check(a) { console.log(a instanceof Foo); } }; const foo = new Foo(); Bar.prototype.check(foo);
在std / esm项目中有一个issue,其中有人正在经历同样的事情.我没有使用那个库,所以没有关于细节的想法.
或者我可以离开.