Я столкнулся с проблемой ниже с 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() в функцию класса f 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 foo.
Как мне сделать this для вызова функции родительской версии, которая переопределяется дочерним элементом в цепочке конструктора?
Или есть ли лучшее решение, когда дело доходит до такого сценария?
Edit
Итак, после прочтения ответов главный вопрос становится -
Не рекомендуется ли помещать 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, С++...?
Должен ли я вручную вызывать такие вещи new A().init(), чтобы помочь мне инициализировать вещи?