2012-05-31 7 views
8

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

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

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 

私は単純に破壊する方法とからthis = undefinedを行うことができないことを理解し、私はそうのようなタイムアウトを使用して、私はそれを回避できると思っていましたクロージャからselfを経由してインスタンスにアクセスできますが、それは機能していないようです。その関数の中から私がconsole.log(self)の場合は、undefinedと表示されますが、グローバルスコープのkはまだKlassのインスタンスです。

誰でもこの作業を行う方法を知っていますか?

+0

なぜこのようなインスタンスを '破棄する必要があるのですか?あなたが尋ねた質問に答えることは一つのことですが、それは私の質問 –

+0

のためにしようとしていることを助けることができませんJavaScriptはガベージコレクトされ、オブジェクトを破壊する明示的な方法がないので、尋ねている。パウエルの場合と同様に、私はなぜあなたにそのようなことが必要なのか非常に不思議です。あなたがしたいことを達成するためのよりよい方法があります。 – chuckj

+0

これはjQueryプラグインのためのものです。破棄メソッドを持つことは、devsが自分のインスタンスを削除または設定解除することを期待してより直感的に思えるかもしれませんが、おそらくそうではありません。 –

答えて

3

kは、Klassのインスタンスを指摘する参考文献です。 destroyをメソッドKlassと呼び出すと、関数内のthisdestroyメソッドを呼び出したオブジェクトにバインドされます。今度はKlassのインスタンスへの別の参照です。その小さなクロージャーで閉じたselfは、そのインスタンスへのもう1つの参照です。 undefinedに設定すると、その参照の後ろにあるインスタンスではなく、その参照が消去されます。あなたは実際にそのインスタンスそのものをdestroyインスタンスすることはできません。 についてはを忘れてもかまいません(すべての参照をundefinedに設定してください)、それはあなたが行ける限りです。

あなたがこれで達成したいことを教えてください。私たちはあなたが解決策を見つけるのを手伝ってくれることを嬉しく思います。

+0

あなたはそうです、私はいつも 'self = this'を割り当てることは' this'がどこにあるのかを参照するだけであることを忘れています。明らかに、それは動作しません、ありがとう! –

0

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

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

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オブジェクトのブラウザ環境を想定しています。

+0

あるいは、変数の名前を 'destroy(ref);'に渡し、必要に応じてコードを評価することもできます。 –

+0

'k.destroy()'の直前に 'a = k'があればどうしますか?私は、 'a'がそのインスタンスを参照していると仮定します。 –

+0

@PavelVeller正確に正しいです。私はこれが頑強な解決策であるとは提案していません。 –

1

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

関連する問題