Вызов родительской функции, которая переопределяется дочерним элементом во время цепочки конструктора в JavaScript (ES6) [duplicate]

На этот вопрос уже есть ответ здесь:

Вызов родительского конструктора переопределяет функции до завершения всех дочерних конструкторов 1 ответ

Я столкнулся с проблемой ниже с JavaScript (ES6)

class A{
  constructor(){
    this.foo();
  }
  foo(){
    console.log("foo in A is called");
  }
}

class B extends A{
  constructor(){
    super();
    this.foo();
  }
  foo(){
    console.log("foo in B is called");
  }
}

Что я ожидаю

foo in A is called
foo in B is called

Но на самом деле это

foo in B is called
foo in B is called

Я знаю, что могу решить эту проблему, просто добавивsuper.foo() в функции Foo класса B

class B extends A{
  constructor(){
    super();
    this.foo();
  }
  foo(){
    super.foo() // add this line
    console.log("foo in B is called");
  }
}

Но представьте себе сценарий, похожий на этот:

Ребенок должен переопределить функцию родителя, чтобы выполнить некоторые дополнительные работы и не допустить доступа извне к исходной.

class B extends A{
  constructor(){
    super();
    this.initBar();
  }
  foo(){
    super.foo();
    this.bar.run(); //undefined
    console.log("foo in B is called");
  }
  initBar(){
    this.bar.run = function(){
      console.log("bar is running");
    };
  }
}

Кажется, чтоthis по-прежнему указывает на ребенкаB при построении в родительскомA, Вот почему я не могу связаться с родителямиA«sfoo.

Как мне сделатьthis вызвать функцию родительской версии, которая переопределяется дочерним процессом в цепочке конструктора?

Или есть ли лучшее решение, когда дело доходит до такого сценария?

редактировать

Итак, после прочтения ответов главный вопрос становится -

Не рекомендуется ли ставитьinitialize helpers или жеsetter functions в конструкторе в JavaScript, так как дети имеют возможность переопределить их?

Чтобы прояснить ситуацию более четко :( извините за мой предыдущий плохой пример :()

class A{
  constructor(name){
    this.setName(name);
  }
  setName(name){
    this._name = name;
  }
}

class B extends A{
  constructor(name){
    super(name);
    this._div = document.createElementById("div");
  }
  setName(name){
    super.setName(name);
    this._div.appendChild(document.createTextNode(name));
  }
}

new B("foo")

this._div будетundefined.

Это плохая идея, так как ребенок сможет переопределить функцию?

class A{
  constructor(name){
    this.setName(name); // Is it bad?
  }
  ...
}

Так что я не должен использоватьinitialize helpers или жеsetter functions в конструкторе, как в Java, C ++ ...?

Должен ли я вручную называть такие вещиnew A().init() чтобы помочь мне инициализировать вещи?

Ответы на вопрос(1)

Ваш ответ на вопрос