8

JavaScript コンストラクター関数があり、そのプロトタイプに destroy メソッドを設定するとします。destroy メソッドからインスタンスを削除 (または少なくとも設定解除) することは可能ですか? これが私がやろうとしていることの例です。

Klass.prototype = {
  init: function() {
    // do stuff
  },
  destroy: function() {
    // delete the instance    
  }
};

k = new Klass
k.destroy()
console.log(k) // I want this to be undefined

destroy メソッドでは単純に実行できないことは理解していますがthis = undefined、次のようにタイムアウトを使用することでそれを回避できると考えました。

destroy: function() {
  var self = this;
  setTimeout( function() {
    self = undefined
  }, 0)  
}

タイムアウト機能はクロージャーからインスタンスにアクセスできると思っていましたselfが(実際にアクセスしています)、うまくいかないようです。その関数console.log(self)内から見ると として表示されますundefinedk、グローバル スコープではまだ のインスタンスですKlass

これを機能させる方法を知っている人はいますか?

4

4 に答える 4

4

kのインスタンスを指す参照ですKlass。関数内のdestroyメソッドとして呼び出すと、メソッドを呼び出したオブジェクトにバインドされます。のインスタンスへの別の参照になりました。その小さなクロージャーで閉じている は、そのインスタンスへのさらに別の参照です。設定すると、その背後にあるインスタンスではなく、その参照がクリアされます。そのインスタンス自体は実際にはできません。あなたはそれを忘れることができます(すべての参照をに設定すると、再びそれを見つけることはありません)が、それはあなたができる限りです.KlassthisdestroyKlassselfundefineddestroyundefined

とはいえ、これで達成したいことを教えてください。解決策を見つけるお手伝いをさせていただきます.

于 2012-05-31T00:45:14.183 に答える
2

独自のオブジェクト インスタンスを削除することは可能ですが、非常に粘着性があります。この記事をチェックしてみてください。

于 2012-05-31T00:55:43.740 に答える
0

あなたがやろうとしていることは不可能です。上書きthisしても、そのインスタンスへの参照を保持する変数には影響しません。そして、その上で関数を呼び出すと、正しいthis.

あなたができる唯一のことはdestroy、呼び出されたときに他の関数が例外をスローするように関数に変数を設定することです。しかし、それは物事を遅くするので(わかりました、それは無視できます)、それがdestroy()呼び出された後はもう使用されないはずのクラスのドキュメントに入れることができるので、それは悪い考えです.

于 2012-05-31T00:43:34.080 に答える
0

new Klass()これは機能しますが、インスタンス化される変数の名前を知っている必要があります。

function Klass() {};

Klass.prototype = {
  init: function() {
    //
  },
  destroy: function() {
    // Delete the variable that references the instance of the constructor.
    delete window.k;
  }
};

k = new Klass();
k.destroy();
console.log(k);

変数の名前がそれ以外の場合、k機能しません。

// Won't work.
u = new Klass();
u.destroy();

kまた、ローカル変数が実際にグローバル スコープにあることも前提としています。関数内にある場合も機能しません。例えば:

// Won't work.
var fn = function() {
  k = new Klass();
  k.destroy();
};

最後に、windowオブジェクトのブラウザ環境を想定しています。

于 2012-05-31T00:51:49.563 に答える