2

この質問はこれと似てますが、クロムコードでやりたくないという点が異なります。

javascript (ブラウザで実行) では、特定の構造で作成されたすべてのオブジェクトを追跡したいと考えています。簡単に、私はこのようにすることができます:

var listObjects = [];

function Object() {
  listObjects.push(this);
}

Object.prototype = {
  // class members
}; 

これは問題ありませんが、オブジェクトが使用されなくなっても保持されます (listObjects にはまだ参照があるため、ガベージ コレクターはそれらを保持します) メモリ リークを作成します。ここで、リストからオブジェクトを削除する「removeObject」関数を追加できますが、オブジェクトが範囲外になるたびにユーザーが手動で呼び出す必要があります。これは、次の場合に解決できます

  1. 弱い参照があるでしょう
  2. 1 つのオブジェクトへの参照がいくつあるかを調べることができます。
  3. 自動的に呼び出されるデストラクタを定義できます

残念なことに、私の調査によると、これらのいずれも JavaScript には存在しません (少なくとも、ブラウザーで実行することになっている場合はそうではありません)。

これを行うためにJavaScriptで機能する別の方法、またはこれを行うために使用できる見逃したJavaScript機能を誰かが考えられますか?

4

1 に答える 1

1

JavaScript でこれに対する言語サポートはないと思います。また、少なくともブラウザー環境では、弱参照のサポートもないと思います。

ただしfunction Object()、オーバーライドのアイデアを維持しながら<div>、追跡するオブジェクトの詳細を画面上の非表示に書き込むことで、何か(かなり、かなり、かなり醜い...)を試みることができます。

ほら、オブジェクトの実際の参照を保持せずに追跡します。ただし、その div から情報を取得し、時間の経過とともにクリアするために、いくつかのクエリ関数を実装する必要があります。そうしないと、リークも発生します。

または、提案したことを行うこともできます。汎用コンストラクターと汎用デストラクタを作成しますが、リストからオブジェクトを削除するには、それらを明示的に呼び出す必要があります。しかし、予期せぬ事態が発生した場合、デストラクタは呼び出されないため、予想外の方法で多くのリークが発生する可能性があります。

他の人が代替案を考えられるかどうか知りたいです。

于 2012-11-13T12:39:18.523 に答える