2015-12-09 21 views
10

これはかなり頻繁に実行される問題で、これを処理する正しい方法を発見したいと考えていました。ES6の循環依存性

parent.js

export default { 
    x: 1 
} 

a.js

import parent from 'parent.js' 
export default parent.extend(a, { title: 'a' }) 

b.js

だから私はこのようなセットアップを持っています

import parent from 'parent.js' 
export default parent.extend(b, { title: 'b' }) 

クール、今は子供がいます。 しかし、オブジェクトがまたはbのインスタンスであるかどうかをチェックするparent.jsの関数を持っていたいと思っています。

だから私はこれを行う可能性があります:

parent.js

import a from 'a' 
import b from 'b' 

export default { 
    x: 1, 
    checkType (obj) { 
    if (obj instanceof a) { 
     return 'a' 
    } else if (obj instanceof b) { 
     return 'b' 
    } 
    } 
} 

まあ今では、循環依存関係です。これを処理するエレガントな方法はありますか?

+0

「parent.extend」とは何ですか?そして、 'instanceof'はそこでどのように動作しますか? 「新」ですか? – elclanrs

+0

申し訳ありませんが、より明確になっているはずです。私は、簡潔にするために何らかのバックボーン風のプロトタイプ継承を想定しています。 – Hud

+2

'checkType'はメインの親ファイルにある必要がありますか?あなたが別のファイルに置くと、これが解決されるようです。 – loganfsmyth

答えて

2

es6クラスを使用できる場合は、コンストラクタでsuper()コールを利用できます。あなたがしたくない場合は

Parent.js

export default class { 
    constructor(options, child) { 
     this.child = child; 
     this.x = 1; 
    } 

    checkType() { 
     return this.child; 
    } 
} 

A.js

import Parent from './Parent'; 

export default class extends Parent { 
    constructor(options) { 
     super(options, 'a'); 
    } 
} 

B.js

import Parent from './Parent'; 

export default class extends Parent { 
    constructor(options) { 
     super(options, 'b'); 
    } 
} 

:私は、多くの場合、このような何かをやりますおそらくより多くのFPスタイルが必要になるでしょう。

parent.js

export default function(child) { 
    return { 
     x: 1, 
     checkType (obj) { 
      return child; 
     } 
     extend (something) { 
      // assuming the returns something as you said 
     } 
    } 
} 

import parent from 'parent.js' 
export default parent('a').extend(a, { title: 'a' }) 

a.js b.js

認識している親クラスのロジックを持つ
import parent from 'parent.js' 
export default parent('b').extend(b, { title: 'b' }) 
7

:あなたは、親機能を作ることができますサブクラスの深刻な反パターンです。代わりに、型を返すサブクラスにメソッドを追加します。例えば、a.jsに:

import parent from 'parent.js'; 
export default parent.extend(a, { title: 'a', checkObj() { return 'a'; }}); 

checkObjから目的の戻り値は、その後の進路だけで、常にtitleプロパティの値である場合:

// parent.js 
export default { 
    x: 1, 
    checkObj() { return this.title; } 
} 

私がやっている正確に何extend分かりませんここに。私はそれがある種のサブクラス化メカニズムであると仮定しています。

一般的に、循環インポートの依存関係は、本当に必要なときにそれらを処理する方法はありますが、コードを構造化した方法に何か問題があることを伝えようとしています。