2013-05-02 29 views
22

私は、(Model.validator)バリデーターインスタンスを持ち歩くModelを持っており、Modelの属性にアクセスするにはValidatorが必要です。だから、私が出ていることオブジェクト間の循環参照は悪い習慣ですか?

var Validator = function(model) { 
    this.model = model; 
}; 

var Model = function() { 
    this._attributes = {}; 
    this.validator = new Validator(this); 
}; 

var model = new Model(); 

以下れるこのコードは、これらの2つのオブジェクト間の循環参照を作成します。これはメモリリークの原因となる悪い習慣ですか?それを実装する方法に関する他のアイデア?

P.S. Angular.jsスコープ内のオブジェクト間にこのような循環参照があります。

+6

@ArunPJohny :-)自分を台無しにしない限り、それは問題ありません:IE6で多分...しかし、現代のJSエンジンは完全にGCサイクルを処理することができます。 – georg

+3

@ArunPJohny:普通のJSオブジェクトで、DOMを含んでいない場合でもIE6にはありません – Bergi

+0

循環参照はシリアル化(例えば 'JSON.stringify() 'を介して) – Uriel

答えて

19

この種のコードでは、今日のブラウザでメモリリークが発生することはありません。 mentioned on MDNとして、すべての主要なブラウザは、しばらくの間、マークアンドスイープGC(サイクルをうまく処理できる)で出荷されています(たとえば、Firefox自体にバージョン3以降のサイクルコレクタがありました)。

アーキテクチャの観点からは、この種のコードは、2つのオブジェクト間の適度な密結合をもたらします(小さなものでも変更がある場合、もう1つは変更する必要があるかどうかを判断するために再検討する必要があります)。可能であれば避けてください。しかし、それには本質的に間違ったものは何もありません。

+6

"カップリング " - あなたは控えめな表現です。 –

+1

@ErickRobertson:まあ、他の言語では、クラスベースの継承もあります。「friend」、「ちょうど仕事をやめてください」というリフレクション...少なくともここでは、パブリックインターフェイスで悩むだけです。 :-) – Jon

2

確かに問題はありません。ほとんどのブラウザのJSパーサーは、ガベージコレクション中にサイクルの依存関係を処理できます。これ以上の潜在的な問題はありません。

2

ガベージコレクションには問題ありません:新しいガベージコレクタ(> IE6)は循環参照をうまく処理します!

再帰関数を実行している場合や、オブジェクトを印刷している場合は問題になる場合があります。

だから、答えは:あなたが

関連する問題