Почему instanceof класса возвращает false, даже если конструктор находится в своей цепочке прототипов? - PullRequest
0 голосов
/ 28 ноября 2018

В приложении 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) возвращает SomeClass, как и a.constructor.name.Однако a instanceof SomeClass возвращает false.

Кроме того, просто проверка равенства между импортируемым классом и классом, переданным в функцию, возвращает false.

require.resolve('utils/class') возвращает одинаковый путь для обоих импортов.

models / 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, так же, как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

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Чарли в комментариях указал нам правильный путь.

https://github.com/DaveStein/esm-bug воспроизводит это, и я отметил это как таковой в проблеме, о которой Чарли сообщил https://github.com/standard-things/esm/issues/633.

0 голосов
/ 28 ноября 2018

Это связано с тем, что экземпляры 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);

Существует проблема в проекте std / esm, где кто-то испытывает то же самое.Я не пользуюсь этой библиотекой, так что никаких идей о специфике нет.

Или я могу быть далеко.

...