Доступ к закрытому методу в переопределенном методе, вызываемом из конструктора базового класса - PullRequest
4 голосов
/ 15 апреля 2020

Рассмотрим следующий код:

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()?

1 Ответ

0 голосов
/ 15 апреля 2020

Это проблема только при попытке вызвать приватный метод во время конструктора. Я думаю, это потому, что дочерний класс еще не был полностью создан в конструкторе родителя, поэтому закрытый метод еще не доступен.

См. Пример ниже, где я вызываю this.myOverrideMethod() из обычного метода и звонок разрешен.

class MyBase {
  constructor() {
  }
  doit(b) {
    this.myOverrideMethod(b);
  }
  myOverrideMethod(b) {}
}
class MyClass extends MyBase {
  constructor() {
    super();
  }
  myOverrideMethod(b) {
    if (b) {
      this.mySpecificMethod();
    } else {
      this.#myPrivateMethod();
    }
  }
  mySpecificMethod() {
    console.log('mySpecificMethod');
  }
  #myPrivateMethod = () => {
    console.log('#myPrivateMethod');
  };
}
new MyClass().doit(true);
new MyClass().doit(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...