私は期待して何のJavaScript(ES6)コール親関数(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
ですしかし、実際に、それは私が単にクラスにsuper.foo()
を追加することによってこの問題を解決することができます知っている
foo in B is called
foo in B is called
ですBの関数foo
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");
};
}
}
親A
で構築中this
はまだ子供B
を指しているようです。だから私は親に到達することができませんA
のfoo
。
this
は、コンストラクタチェーン中に子によってオーバーライドされる親バージョン関数を呼び出すにはどうすればよいですか?
また、このようなシナリオになると、より良い解決策がありますか?
編集
だから、答えを読んだ後、メインの質問はなった -
それは子供たちがそれらを上書きする機会を持っているので、JavaScriptでコンストラクタでinitialize helpers
かsetter functions
を入れてがっかりですか?
より明確な状況明確にする:(私の以前の悪い例:(申し訳ありませんが)
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?
}
...
}
だから私はconstの中initialize helpers
かsetter functions
を使用しないでくださいJava、C++のようなルーダ...?
私は物事を初期化するためにこのnew A().init()
のようなものを手動で呼び出す必要がありますか?
*親バージョンの関数を呼び出すには 'this'をどうすればいいですか? - ' super'が唯一の方法です。 – thefourtheye
なぜ 'A'コンストラクタは' this.foo() 'を全く呼びますか?インスタンスを初期化するだけでよいはずはありません。 – Bergi
子の 'foo'は、一般的な原因で親の実装をオーバーライドすることを意味しますか、または" foo "をプライベートヘルパーにする方法をもっと求めていますか? – loganfsmyth