Вызов родительской функции, которая переопределяется дочерним элементом во время цепочки конструктора в 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()
чтобы помочь мне инициализировать вещи?