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:
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?
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.
Obwohl das Löschen einer eigenen Objektinstanz möglich ist, ist es sehr schäbig. Vielleicht möchten Sie diesen Artikel lesen.
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.
Das funktioniert, aber Sie müssen wissen, wie der Name der Variablen lautet, auf die der new Klass()
instanziiert wird:
Wenn die Variable k
einen anderen Namen hat, funktioniert sie nicht:
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:
Schließlich wird eine Browser-Umgebung für das window
-Objekt vorausgesetzt.
Tags und Links javascript