2017-05-08 7 views
0

JavaScript ES6を使用する私は、私のアプリケーションのさまざまな懸案事項を分けたいいくつかのクラスがあります。私はクラスをインスタンス化し、それらを介してメソッドを参照して呼び出すことができるmain.jsファイルを持っています。2つ以上のJavaScript ES6クラスをインスタンス化して使用する

私の質問です:これを行うための最高の/標準的な方法は何ですか?私の現在のアプローチは以下の通りです。

main.js では、私はそれは確かに動作します。この

export default class ClassOne { 
    constructor (app) { 
     this.app = app; 
     this.app.two.callMethod(); 
    } 
} 

ような何かを行う二つのクラス

ClassOne.jsで次に
import ClassOne from './ClassOne'; 
import ClassTwo from './ClassTwo'; 

export default class App { 
    constructor() { 
     this.one = new ClassOne(this); 
     this.two = new ClassTwo(this); 
    } 
} 
const app = new App(); 

をインスタンス化するアプリケーションクラスを作成しますが、それはstoopid &それを行うより良い方法はありますか?

+1

実際には動作しません。 'ClassOne'のコンストラクタが呼び出されると、' App'インスタンスはまだ 'app.two'プロパティを持っていません。循環依存が這い上がるたびに注意する必要があります。 – Bergi

+0

「最良」を判断するためには、いくつかの評価基準が必要です。 「見た目が綺麗だ」というのは本当に適切な基準ではない。 – RobG

+1

これは、 'two'がまだインスタンス化されていないので、実際には使用してはいけません。明示的な依存性注入は、「App」のインスタンスの代わりに、「ClassTwo」のインスタンスを「ClassOne」に渡すための方法です。 – deceze

答えて

2

私はClassOneとClassTwoでセッターを持つことをお勧めします。そうすれば、ClassOneとClassTwoだけがお互いに依存し、Appのインスタンスには依存しません。

ClassOne.js

export default class ClassOne { 
    setTwo (two) { 
     this.two = two; 
     this.two.callMethod(); 
    } 
} 

ClassTwo.js

export default class ClassTwo { 
    setOne (one) { 
     this.one = one; 
     this.one.callMethod(); 
    } 
} 

main.js

import ClassOne from './ClassOne'; 
import ClassTwo from './ClassTwo'; 

export default class App { 
    constructor() { 
     this.one = new ClassOne(); 
     this.two = new ClassTwo(); 

     this.one.setTwo(this.two); 
     this.two.setOne(this.one); 
    } 
} 

const app = new App(); 
+0

@ justindeguzmanありがとう、これは非常にうまくいく – listingslab

関連する問題