は、私は両方がそうのように互いに依存する2つのクラスをインスタンス化します。この鶏肉や卵の問題を「エレガントな」方法で解決するにはどうすればいいですか?または、メソッドを使用してインスタンス化した後にb
への参照を設定する必要がありますか?循環参照のインスタンス
1
A
答えて
1
この問題をA
とB
のコンストラクタに移動することをお勧めします。
あなたがこの場合の条件(間接)再帰活用することができます:||
を使用することにより
function A(b)
{
this.b = b || new B(this);
}
function B(a)
{
this.a = a || new A(this);
}
を、あなたはこのように終わる、それぞれA(this)
とB(this)
への呼び出し自体は別のB
/A
を作成しないことを保証します」鶏肉/卵 "問題。
次に、あなたはA
またはB
が合法的null
に自分の.b
または.a
セットを持っている場合がある場合は、あなたがundefined
とnull
を使用することができます
this.a = new A();
this.b = this.a.b;
または
this.b = new B();
this.a = this.b.a;
のようにそれらを使用することができますこれらのケースを区別して、それに応じてコンストラクタを変更します。
function A(b)
{
this.b = b === undefined ? new B(this) : b;
}
function B(a)
{
this.a = a === undefined ? new A(this) : a;
}
もしA
とB
は、それがa
とb
フィールドを保持しているので、あなたは(作成範囲からそれらをthis
インスタンスを渡すことができ、そのコンストラクタに他の引数を必要とする、またはその他の理由で別のB
またはA
自分自身を構築するべきではありませんその値A
とB
が構成されている場合)、アクセスされたときのみが判定される。
function A(container)
{
this.container = container;
// Access B via this.container.b
}
function B(container)
{
this.container = container;
// Access A via this.container.a
}
this.a = new A(this);
this.b = new B(this);
A
とB
が完全ACを有するように意図されていない場合コンテナオブジェクトに目的税、あなたのような、その代わりに使用される仲介オブジェクトを作成することができます。それが何らかの理由でも受け入れられない場合は、あなたの唯一のオプションは後でa.b
とb.a
の値を変更することです
var aProxy = { a: null };
var bProxy = { b: null };
this.a = aProxy.a = new A(bProxy);
this.b = bProxy.b = new B(aProxy);
手動割り当てまたはセッター機能を介して実行される。
関連する問題
- 1. 循環参照
- 2. Java循環参照
- 3. クラス循環参照
- 4. Excel VBAの循環参照
- 5. モジュール間の循環参照?
- 6. DBの循環参照
- 7. 循環参照の検索
- 8. Protostuff循環参照のRuntimeSchema?
- 9. Entity Frameworkの循環参照
- 10. Javascript /ガベージコレクタの循環参照
- 11. Microsoft Moles:循環参照エラー?
- 12. jQuery DataTables循環参照エラー
- 13. ストライプ - JSON循環参照
- 14. 春@ResponseBody JSON循環参照
- 15. "循環属性グループ参照"
- 16. ビジネスエンティティ、データアクセスレイヤー - 循環参照
- 17. 循環参照パッケージ - Python/Django
- 18. スカラPlayJson循環参照
- 19. ASP C#ユーザーコントロール循環参照
- 20. ジャクソンシリアル化循環参照スタックオーバーフローエラー
- 21. エンティティフレームワーク、コードファーストモデリングと循環参照
- 22. 可能な循環参照?
- 23. 循環参照(再び...)
- 24. ジキルYAML循環参照
- 25. Javascript循環参照例外
- 26. 外部キーを解決するための循環参照と循環参照
- 27. Javascriptの循環参照の例?
- 28. Hibernate @onetomany Gsonとの循環参照エラー
- 29. Xamarinのガベージコレクタと循環参照
- 30. イテレータと循環参照のC++コンテナ
「A」と「B」のコンストラクタで行います。例えば。 'A'の場合、' null 'を渡した場合は 'this.b = new B(this);'を設定します。 'B'が' a!= null'を渡されると、再帰が終了します。 'A'と' B'が入れ替えられたのと同じ方法です。 – Siguza
私は両方のオブジェクトがインスタンス化された後にループを完了するためにセッターを使うことが唯一の方法だと思います。 – Claudiu