используя instanceof с классом, возвращаемым из функции - PullRequest
2 голосов
/ 18 марта 2020

Поскольку es6 не поддерживает вложенные классы, я решил добавить вложенный класс к получателю c родительского состояния. Например:

class Dictionary {
  static get Category () {
    return class Category {
      static is (inst) {
        return inst instanceof Category
      }
      constructor () {}
    }
  }
}

Однако у меня проблема с instanceof. Я хочу убедиться, что данная переменная является правильным экземпляром.

const test = new Dictionary.Category()
const ctor = Dictionary.Category

console.log(test instanceof Dictionary.Category) // false
console.log(Dictionary.Category.is(test)) // false
console.log(test instanceof ctor) // false
console.log(test.__proto__.constructor === ctor) // false
console.log(test.constructor === ctor) // false
console.log(test.constructor, ctor) // both function Category()
console.log(new Dictionary() instanceof Dictionary) // true (sanity check)

До сих пор я тестировал constructor.name, но это ограничено. Как я могу решить эту проблему?

Благодаря ответу ниже, указывающему на проблему, вот рабочее решение:

class Dictionary {
  static get Category () {
    Dictionary.__Category = Dictionary.__Category || class Category {
      constructor () {}
    }
    return Dictionary.__Category
  }
}

1 Ответ

2 голосов
/ 18 марта 2020

Это сбой, потому что каждый доступ к свойству getter создает совершенно новый класс, просто в нем присутствуют все те же вещи, что и тот, который вы получили в прошлый раз, когда обращались к getter.

Если вы хотите вложенное свойство, используйте свойство, например

class Dictionary {
}
Dictionary.Category = class Category {
  static is (inst) {
    return inst instanceof Category
  }
  constructor () {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...