Почему в коде ниже я получил неправильный this.name ссылка внутри абстрактного метода реализации?Зачем ошибаться this.propertyName ссылка внутри абстрактного метода реализации?
abstract class Abstract {
protected name: string;
constructor() {
this.abstractMethod();
}
protected abstract abstractMethod(): void;
}
class Concrete extends Abstract {
protected name: string = 'Concrete';
protected abstractMethod() {
console.log(this, this.name); // Concrete, undefined
}
}
new Concrete();
Уверены ли вы? Я не получаю сообщение об ошибке на ссылке ни на мою IDE. –
Как правило, не рекомендуется вызывать виртуальные методы из конструктора в C#, java или javascript, поскольку инварианты типа могут ломаться. (см. сообщение Eric Lipperts, чтобы узнать, в чем проблема с ним, особенно раздел комментариев https://blogs.msdn.microsoft.com/ericlippert/2008/02/18/why-do-initializers-run-in-the-opposite -order-as-constructors-part-two /) –