Как избежать вызова дочернего метода из родительского класса в javascript?

#javascript

#javascript

Вопрос:

Пример:

 class Parent {
    funcA() {this.funcB();}
    funcB() {console.log('FuncB in Parent');}
  }

class Child extends Parent {
    funcA() {super.funcA();}
    funcB() {console.log('FuncB in Child');}
  }

let child = new Child();
child.funcA();
  

Проблема в том, что я получаю FuncB in Child в результате.

Я хочу явно заставить родительский funcA метод всегда вызывать свой собственный funcB , игнорируя, перегружен ли funcB в дочерних классах.

Я пытался this.__proto__.__proto__.funcB.call(this) в этом случае, но я предполагаю, что есть лучшие способы.

Можете ли вы указать мне правильное направление?

Комментарии:

1. Обычно это считается хорошей вещью. Вы можете обойти это с Parent.prototype.funcB.call(this) помощью , но это немного странно. Для чего это будет использоваться? Может быть, частный метод или отдельная функция были бы лучше?

2. Подобная ситуация является хорошим признаком того, что вы неправильно продумали свою объектную модель.

3. private вы имеете в виду, начиная с _ ? Боюсь, я могу время от времени переопределять его в одном из дочерних классов с помощью другого частного метода, который может нарушить логику родительского класса, и нет никакого способа защититься от этого. Как я понимаю, есть #private обозначение, но оно пока не поддерживается должным образом.

4. @Pointy, давайте предположим, что funcB это какой-то псевдозакрытый метод _funcB , например _initializeInternalDataStructure() метод. Я могу легко иногда переопределять его в одном из дочерних классов, используя одно и то же довольно распространенное имя для этой псевдособственной функции.

5. Конечно, с этим можно справиться, но, по-видимому, есть причина , по которой дочерний класс переопределяет этот API своей собственной специализированной реализацией. Обратите внимание, что funcB() в дочернем можно, если это имеет смысл, вызвать super.funcB() .