Конструктор родителя вызывается до того, как дочерний элемент может инициализировать данные своего экземпляра, поэтому вы не можете ссылаться на экземпляр дочернего элемента в конструкторе родительского элемента.Это просто неправильный дизайн ООП (по крайней мере, в Javascript).Если родительский объект хочет получить доступ к свойству в конструкторе, тогда определите и инициализируйте свойство в конструкторе родительского объекта (дочерний элемент все еще может использовать его).
Родители не должны зависеть от детей - дети зависят от родителей.
Итак, это ошибочная конструкция ООП.Вы не показываете реальную проблему, которую пытаетесь решить, поэтому мы не можем точно предложить, какой будет правильный дизайн для данной проблемы.
Чтобы рассмотреть, порядок вещей:
- Дочерний конструктор называется
- Дочерний конструктор вызывает
super(...)
для выполнения родительского конструктора - Родительский конструктор инициализирует данные своего экземпляра
- После родительского конструкторавозвращает, конструктор Child имеет возможность инициализировать свои данные экземпляра
Если вы используете определения классов ES6, вы не можете изменить эту последовательность на что-то другое.
На основев вашем последнем комментарии к этому ответу, я не думаю, что есть действительно лучший способ, чем просто добавить дополнительные строки кода для каждого ребенка:
class Parent {
constructor(name) {
if (!name) {
// could also throw an exception here if not
// providing a name is a programming error and is not allowed
this.name = "Default Name";
} else {
this.name = name;
}
console.log(this.name);
}
}
class ChildA extends Parent {
constructor() {
super("ChildA Name");
}
}
class ChildB extends Parent {
constructor() {
super("ChildB Name");
}
}
const c = new ChildA();
// Should console.log "ChildA Name";