最終的に、JS にはプロキシ機能が組み込まれる予定です。これにより、バックグラウンドで発生するあらゆる種類のことへの低レベルのアクセスが可能になり、フロントエンド開発者に公開されることはありません (プロキシを介する場合を除きます。魔法だと考えてください)。 -PHP などの言語のメソッド)。
その時点で、トリガーとしての破壊/ガベージ コレクションのサポートがプラットフォーム間で 100% 保証されている限り、カウンターをデクリメントするデストラクタ メソッドをオブジェクトに記述することは、まったく簡単なことかもしれません。
現在、確実に行う唯一の方法は、作成されたすべてのインスタンスの囲まれたレジストリを作成し、それらを手動で破棄することです (そうしないと、ガベージ コレクションが行われません)。
var Obj = (function () {
var stack = [],
removeFromStack = function (obj) {
stack.forEach(function (o, i, arr) {
if (obj === o) { arr.splice(i, 1); }
makeObj.count -= 1;
});
};
function makeObj (name) {
this.sayName = function () { console.log("My name is " + this.name); }
this.name = name;
this.explode = function () { removeFromStack(this); };
stack.push(this);
makeObj.count += 1;
}
makeObj.checkInstances = function () { return stack.length; };
makeObj.count = 0;
return makeObj;
}());
// usage:
var a = new Obj("Dave"),
b = new Obj("Bob"),
c = new Obj("Doug");
Obj.count; // 3
// "Dave? Dave's not here, man..."
a.explode();
Obj.count; // 2
a = null; // not 100% necessary, if you're never going to call 'a', ever again
// but you MUST call explode if you ever want it to leave the page's memory
// the horrors of memory-management, all over again
このパターンはあなたがやりたいことをしますか?に限って:
- あなたは
a
別のものに変わりません
explode
そのメソッドを上書きしないでください
- あなたは決して台無しにしないで
Obj
ください
prototype
メソッドが内部変数にアクセスできるとは思わない
...はい、この方法は、カウンターを適切に機能させるためにうまく機能します。と呼ばれる一般的なメソッドを作成することもできます。このメソッドは、渡したオブジェクトrecycle
のメソッドを呼び出しexplode
ます (そのコンストラクターまたはファクトリがそのようなことをサポートしている限り)。
function recycle (obj) {
var key;
obj.explode();
for (key in obj) { if (obj.hasOwnProperty(key)) { delete obj[key]; } }
if (obj.__proto__) { obj.__proto__ = null; }
}
注 - これは実際にオブジェクトを取り除くわけではありません。クロージャーからそれを削除し、かつて持っていたすべてのメソッド/プロパティを削除しただけです。
したがって、これは空の殻であり、再利用しnull
たり、部品をリサイクルした後に明示的に設定したり、必要な参照を削除したことを知って収集して忘れたりすることができます.
これは役に立ちましたか?おそらくそうではありません。
これが役に立つと本当に思うのは、キャラクターが一度に 3 発しか発射できないゲームで、画面上の最初の弾丸が誰かに当たるか消えるまで 4 発目を撃つことができない場合だけです。エッジ(これは、たとえば、コントラがその日にどのように機能したかです)。
また、「消えた」弾丸をスタックから移動し、弾道をリセットし、適切なフラグをリセットし、スタックに戻すことで、その弾丸を任意のプレイヤー/敵に再利用することもできます。
しかし、繰り返しになりますが、プロキシによって「魔法の」コンストラクタ/デストラクタ メソッドを定義できるようになるまでは、これらのメソッドは低レベルで受け入れられます。これは、独自のオブジェクトすべての作成と破棄を細かく管理する場合にのみ役立ちます (実際にはそうではありません)。良い考えです)。