2016-07-12 5 views
1

2つのクラス(外部ライブラリから)からの継承を使用してES6クラスを作成したいと思いますが、ES6ではそれを許可しません。ミックスインを使うことはできません。 Implicationは私の唯一の選択肢のようです。オブジェクトimbricationのための良いjavascriptパターン(複数の継承をシミュレート)

たとえば、イベント、ログなどを直接出力するUIコンポーネントクラスがあるとします(多態的な目的のために)。

私は、次のパターンを避けたい:

class UIComponent extends React.Component { 
    constructor(props) { 
     super(props); 
     this.ee = new EventEmitter(); 
    } 

    /* 
    * methods of my UIComponent 
    */ 
    emitThis(val) { 
     this.emit('thisEvent', val); 
    }, 

    onThat(func) { 
     this.on('thatEvent', func); 
    }, 

    doThis() { 
     this.specificLog("i'm doing this"); 
     // do stuff 
    } 

    /* 
    * Here i just implement all methods of EventEmitter... 
    */ 
    on(...args) { 
     this.ee.on(...args); 
    } 

    once(...args) { 
     this.ee.once(...args); 
    } 

    emit(...args) { 
     this.ee.emit(...args); 
    } 

    /* this goes on and on... */ 
} 

のJavascript(ES5、ES6、ES2015)は、この目的のためにいくつかのよりよいパターンを許可していますか?

+1

が発する通常のリアクトアーキテクチャと戦うようですが、あなたは間違いなくとしてイベント・エミッターの実装に混在させることができる、ということを無視しますそれを念頭に置いて書かれているものを使用している限り。 – loganfsmyth

+0

これは、通常のリアクションアーキテクチャに反するものです。私はこのようなパターンを避けたいと思います(eventEmitterのすべてのメソッドを書き直す必要があります。実際には、それ自体がeventEmitterから継承したより複雑なクラスを使用する必要があります)。 – Sebastien

+0

[JavaScriptの多重継承/プロトタイプ] http://stackoverflow.com/q/9163341/1529630)。プロキシを使うことができます。 – Oriol

答えて

1

ES6内のパターンは、基本的には、ミックスでその深いコピーの親プロトタイプ子プロトタイプに、上記のコードをコピーするので列挙キーではなくディスクリプタを単純化しすぎていること

class FosterParent { ...} 

class Child extends Parent { ...} 

let proto = FosterParent.prototype; 

do { 
    for (const key of Object.keys(proto)) 
    if (!(key in Child.prototype)) 
     Child.prototype[key] = proto[key]; 
} while (proto = Object.getPrototypeOf(proto)) 

のようなものです。

ES.NextまたはTypeScriptデコレータが救助に来ています。 @mixin decorator from core-decorators packageを説明したのと同じことを行うことになったがきちんと構文とされていますリアクトコンポーネントを作る

class FosterParent { ...} 

@mixin(FosterParent) 
class Child extends Parent { ...} 
関連する問題