2011-07-30 7 views
2

2つのオブジェクトをリンクするメモリ効率的な方法とは何ですか?対応するインデックス値を持つ2つの配列を使用してオブジェクトを格納すると、オブジェクトはメモリから解放されません。2つのオブジェクトをリンクするJavaScript

実装は次のようになります。あなたがしたいすべてが、なぜ彼らは互いを指していない、別のものに関連付け一つのオブジェクトである場合

var obj ={}; 
var linkedobj = getLinkedObject(obj); 
var obj2 ={} 
var linkedobj2 = getLinkedObject(obj2);    
+0

メモリはどんな意味で効率的ですか?メモリをGCにリリースするという意味では?もしそうなら、それはあなたがきれいにする方法に依存します。使用されるメモリの面で効率的なメモリです。この場合、オブジェクトをリンクする方法がどのように関連しているかは分かりません。目標を明確にすることはできますか?あなたの実装例では、obj2は決して使用されません - その意図ですか? –

答えて

3

オブジェクトは、一般的なコンテナ

ですか?

var obj = {}; 
var obj2 = {}; 

obj.linkedObject = obj2; 
obj2.linkedObject = obj; 

これは通常のことであり、メモリに悪影響はありません。

解放メモリ

あなたがオブジェクト参照の完全なテーブルを保持について尋ねている場合、あなたはそれへのライブ参照の全てがなくなるまで、オブジェクトが消えないことが正しいです。 Javascriptにはガベージコレクタがあり、テーブルや配列の参照が良好であれば、メモリにバックアップされます。テーブルにオブジェクトを与え、それをメモリから完全に削除したい場合は、テーブルからオブジェクトを削除するだけで済みます。他に何も保持する必要がないと仮定して、テーブルを削除することもできます。

getLinkedObject関数が別のオブジェクトのオブジェクトを返すと判断された場合でも、オブジェクトがそれぞれ関連参照を保持できるようにすることができます。

function getLinkedObject(anObject) { 
    return anObject.linkedObject; 
} 

これはおそらく、相手を伴うことになります。これを行う

function linkObjects(anObject, anotherObject) { 
    anObject.linkedObject = anotherObject; 
    anotherObject.linkedObject = anObject; 
} 

あなたはゴミとどのJavaScriptで(ハイレベル、ダイナミックな環境、メモリ管理について少し心配することができますコレクタ)が適切である。

+0

最初は奇妙なことですが、Array.prototypeをオブジェクトにリンクしようとしていますが、Array.prototypeに適切な関係を追加したくありません。 – William

+1

今日のPCにも適切です。あなたのページの1つの高解像度PNGと同じにするために、JavaScriptでいくつのオブジェクトを作成する必要がありますか?もちろん、オブジェクトをループしたり漏らしたりするだけではなく、問題がより深刻になる場合もあります。 –

+0

@ James-それは事実です。もちろん、理解のために質問を調べることは良いことです。 – keparo

1

あなたのフォローアップのコメントからオプションではないように聞こえるkeparoの答えを使用しない限り、あなたが求めているものは基本的に不可能です。元のオブジェクトを増やすことはできないので、そのオブジェクトへの参照を保存する方法が必要です。しかし、(JavaScriptには弱い参照の概念がないため)、これはガベージコレクションの対象から除外され、要件ステートメントと矛盾します。

+0

元々私はこのクライアント側をやろうとしていました。しかし、このような機能がnode.jsに実装されていると便利です。 – William

+0

サーバ側のフレームワークではなく、言語で実装する必要があります。 – Domenic

+0

あなたはc/C++プラグイン/モジュールを書くことができると考えています。オブジェクトのメモリアドレスを格納する方法や、少なくともオブジェクトへのソフトリファレンスを保存する方法があると仮定しています。私はv8エンジンとnode.jsにもっと関わっていく必要があります。 – William