微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

在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,其中有人正在经历同样的事情.我没有使用那个库,所以没有关于细节的想法.

或者我可以离开.

原文地址:https://www.jb51.cc/js/156788.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐