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