Wie sich eine Instanz innerhalb einer Prototyp-Funktion löschen lässt, ist JavaScript

8

Wenn ich eine JavaScript-Konstruktorfunktion habe, und ich habe eine Zerstörungsmethode für den Prototyp festgelegt. Ist es möglich, die Instanz von der Methode destroy zu löschen (oder zumindest zu deaktivieren)? Hier ist ein Beispiel für das, was ich versuche zu tun.

%Vor%

Ich verstehe, dass ich this = undefined nicht einfach mit der Methode destroy ausführen kann, aber ich dachte, ich könnte das umgehen, indem ich ein Timeout wie folgt verwende:

%Vor%

Ich dachte, die Timeout-Funktion hätte Zugriff auf die Instanz über self von der Closure (und das tut es), aber das scheint nicht zu funktionieren. Wenn ich console.log(self) von innerhalb dieser Funktion, wird es als undefined angezeigt, aber k im globalen Bereich ist immer noch eine Instanz von Klass .

Weiß jemand, wie das funktioniert?

    
Philip Walton 31.05.2012, 00:34
quelle

4 Antworten

3

k ist eine Referenz, die auf eine Instanz von Klass verweist. Wenn Sie destroy als Methode von Klass aufrufen, wird die this innerhalb der Funktion an das Objekt gebunden, für das Sie eine destroy Methode aufgerufen haben. Es ist jetzt eine weitere Referenz auf diese Instanz von Klass . Die self , auf die Sie in diesem kleinen Abschluss schließen, ist ein weiterer Verweis auf diese Instanz. Wenn Sie es auf undefined setzen, löschen Sie diese Referenz, nicht die Instanz dahinter. Sie können nicht wirklich destroy diese Instanz an sich. Sie können vergessen darüber (setzen Sie alle Verweise auf undefined und Sie werden es nicht wieder finden), aber das ist so weit wie möglich.

Sagen Sie uns, was Sie damit erreichen wollen und wir helfen Ihnen gerne, eine Lösung zu finden.

    
Pavel Veller 31.05.2012, 00:45
quelle
1

Obwohl das Löschen einer eigenen Objektinstanz möglich ist, ist es sehr schäbig. Vielleicht möchten Sie diesen Artikel lesen.

    
Socratees Samipillai 31.05.2012 00:55
quelle
0

Was Sie versuchen, ist unmöglich. Selbst wenn Sie this überschreiben, wirkt sich dies nicht auf eine Variable aus, die einen Verweis auf diese Instanz enthält. Und das Aufrufen einer Funktion hat immer noch die richtige this .

Sie können nur eine Variable in Ihrer destroy -Funktion setzen, die jede andere Funktion veranlasst, beim Aufruf eine Ausnahme auszulösen. Aber das wäre eine schlechte Idee, da es die Dinge verlangsamen würde (ok, das ist vernachlässigbar) und du kannst einfach die Dokumente deiner Klasse einfügen, die nicht mehr verwendet werden sollen, nachdem destroy() aufgerufen wurde.

>     
ThiefMaster 31.05.2012 00:43
quelle
0

Das funktioniert, aber Sie müssen wissen, wie der Name der Variablen lautet, auf die der new Klass() instanziiert wird:

%Vor%

Wenn die Variable k einen anderen Namen hat, funktioniert sie nicht:

%Vor%

Es nimmt auch an, dass die lokale Variable k wirklich im globalen Gültigkeitsbereich liegt. Wenn es in einer Funktion wäre, würde es auch nicht funktionieren. Zum Beispiel:

%Vor%

Schließlich wird eine Browser-Umgebung für das window -Objekt vorausgesetzt.

    
Noah Freitas 31.05.2012 00:51
quelle

Tags und Links