Рассмотрим следующий код:
class MyBase {
constructor(b) {
this.myOverrideMethod(b);
}
myOverrideMethod(b) {}
}
class MyClass extends MyBase {
constructor(b) {
super(b);
}
myOverrideMethod(b) {
if (b) {
this.mySpecificMethod();
} else {
this.#myPrivateMethod();
}
}
mySpecificMethod() {
console.log('mySpecificMethod');
}
#myPrivateMethod = () => {
console.log('#myPrivateMethod');
};
}
new MyClass(true); // <-- "mySpecificMethod"
new MyClass(false); // <-- Uncaught TypeError: Cannot read private member #myPrivateMethod
// from an object whose class did not declare it
Переопределенный метод myOverrideMethod()
вызывается в конструкторе "базового" класса. Поскольку this
указывает на экземпляр MyClass
, переопределенный метод в производном классе вызывается правильно. Обычный метод mySpecificMethod()
вызывается успешно, а при вызове частного поля #myPrivateMethod()
выдается следующее «TypeError»:
Uncaught TypeError: Невозможно прочитать закрытый элемент #myPrivateMethod
из объект, чей класс не объявил его
Сообщение об ошибке не передает проблему как нарушение доступа к частному полю , а скорее вызывает this
еще не ссылается на экземпляр MyClass
, но все еще ссылается на экземпляр MyBase
! Однако почему это так и как успешно вызвать закрытый метод #myPrivateMethod()
?