2017-09-15 17 views
3

私は、親クラスの特定のメソッドの子の機能を拡張します。私はまだES6のOOPに慣れているので、これが可能かどうか、ルールを破るかどうかはわかりません。JavascriptをES6で、子クラスの親クラスのメソッドを拡張

私はこのような何かを探しています:私は親法上の子固有のコールバックを追加したい本質的には

class Parent { 
    constructor(elem) { 
    this.elem = elem; 

    elem.addEventListener((e) => { 
     this.doSomething(e); 
    }); 
    } 

    doSomething(e) { 
    console.log('doing something', e); 
    } 
} 

class Child extends Parent { 
    constructor(elem) { 
    // sets up this.elem, event listener, and initial definition of doSomething 
    super(elem) 
    } 

    doSomething(e) { 
    // first does console.log('doing something', e); 
    console.log('doing another something', e); 
    } 
} 

。同じ機能を持つ完全に新しいクラスを作成せずにこれを行う創造的な方法はありますか?

+0

'extends'は、クラスごとではなくインスタンスごとのです。あなたは何を達成したいですか? – ideaboxer

+0

は 'スーパー()'コール... – JLF

+0

* @ideaboxer「インスタンス」の私の使用を無視し、「子特異的」と言うだけに私の要求を調整 –

答えて

3

あなたは方法でsuperを使用することができます。

子クラスの親クラスで
doSomething(e) { 
    super.doSomething(e) 
    console.log('doing another something', e) 
} 

thisは同じものであり、実際のオブジェクトを参照するので、あなたは親のコードでメソッドを呼び出した場合、それは意志子供の場合は、子供の実装を呼び出します。 PythonやRubyなど、他の言語でも同じことが起こります。

作業するコードは:

class Parent { 
 
    constructor(elem) { 
 
    this.elem = elem 
 
    this.elem.addEventListener('click', (e) => { this.doSomething(e) }) 
 
    } 
 

 
    doSomething(e) { 
 
    alert('doing something') 
 
    } 
 
} 
 

 
class Child extends Parent { 
 
    constructor(elem) { 
 
    super(elem) 
 
    } 
 

 
    doSomething(e) { 
 
    super.doSomething(e) 
 
    alert('doing another something') 
 
    } 
 
} 
 

 
let child = new Child(document.getElementById('button'))
<button id="button">Alert</button>

+0

私の例では、イベントリスナーによって 'super.doSomething(e)'が呼び出されています。スーパーのイベントリスナーを使って、子プロセスのメソッドをコールバックとしてトリガーする必要があります。この実装は、おそらく、別のメソッドからsuperのメソッドを呼び出すだけで、子を聴いているイベントを再確立してしまいます。 – JLF

+0

@JLFもし私があなたを理解すれば、あなたが望むようにすべてがうまくいくでしょう。 –

+0

これは実際には完全に機能しました。何らかの理由で私は 'super.doSomething(e)'が親の文脈なしで呼ばれていると仮定しました。 – JLF

関連する問題