Код конструктора недоступен

Я передаю метод класса в качестве параметра для создания нового класса следующим образом:

class Abc {
    constructor() {
        this.a = () => { };
    }
    b = new Def(this.a);
}

Я получаю сообщение "Не могу прочитать свойство a undefined" в консоли браузера. Почему aundefined внутри b = new Def(this.a)? При отладке я обнаружил, что браузер выдает ошибку и код конструктора никогда не достигается. Почему это происходит?

Примечание: я использую babel, поэтому я могу использовать поля класса и, следовательно, b = new Def() правильный синтаксис здесь.

1 ответ

Решение

Вот как работают поля классов, они оцениваются до тела конструктора (но после super()). Строка 1 оценивается перед строкой 2, и порядок, в котором конструктор и b поля упорядочены не имеет значения:

constructor() {
    this.a = () => { }; // 2
}
b = new Def(this.a); // 1

Поскольку поля класса уже используются, для поддержания правильного порядка выполнения они должны быть:

a = () => { }; // 1
b = new Def(this.a); // 2

constructor() {}
Другие вопросы по тегам