2012-05-31 12 views
8

Jeśli mam funkcję konstruktora JavaScript i ustawiłem metodę destroy na jej prototypie. Czy można usunąć (lub przynajmniej usunąć) instancję z metody destroy? Oto przykład tego, co próbuję zrobić.Jak usunąć instancję z funkcji prototypowej to JavaScript

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 

Rozumiem, że nie mogę po prostu zrobić this = undefined z metodą zniszczenia, ale myślałem, że mogę poruszać się, że używając timeout tak:

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

Myślałem funkcję limitu czasu miałby dostęp do instancji przez self z zamknięcia (i robi to), ale to nie działa. Jeśli I console.log(self) od wewnątrz tej funkcji pojawia się jako undefined, ale k w zasięgu globalnym jest nadal instancją Klass.

Czy ktoś wie, jak to zrobić?

+0

czy mogę zapytać, dlaczego musisz "zniszczyć" taką instancję? odpowiedź na pytanie, które sobie zadałeś, jest jedną rzeczą, ale może nie pomoże ci zrobić tego, co próbujesz zrobić, stąd moje pytanie: –

+0

JavaScript jest zbiorem śmieci i nie ma explicjonalnego sposobu na zniszczenie obiektu, więc nie ma wbudowanego w język sposobu na zrobienie tego, co Ty pytają. Podobnie jak w przypadku Pavela, jestem bardzo ciekawy, dlaczego potrzebujesz czegoś takiego, prawdopodobnie istnieje lepszy sposób na osiągnięcie tego, co chcesz robić. – chuckj

+0

To jest dla wtyczki jQuery. Posiadanie metody niszczenia wydaje się bardziej intuicyjne, niż oczekiwanie od deweloperów usunięcia lub usunięcia własnych instancji, ale być może nie. –

Odpowiedz

3

k to odwołanie, które wskazuje na wystąpienie Klass. po wywołaniu destroy jako metoda wewnątrz funkcji zostaje przywiązany do obiektu, który nazywa się metodą destroy. Jest to kolejne odniesienie do tego wystąpienia z Klass. self, który zamykasz w tym małym zamknięciu, to kolejne odniesienie do tej instancji. Po ustawieniu go na undefined wyczyścisz to odniesienie, a nie instancję za nim. Naprawdę nie można tak naprawdę wstawić tej instancji. Możesz o tym zapomnieć zapomnieć o (ustawić wszystkie odniesienia do undefined i nie znajdziesz go ponownie), ale to jest tak daleko, jak to możliwe.

Powiedziawszy, powiedz nam, co chcesz osiągnąć, a my z przyjemnością pomożemy Ci znaleźć rozwiązanie.

+0

Masz rację, zawsze zapominam, że przypisanie 'self = this' zawiera jedynie odniesienie do miejsca, w którym' this' znajduje się w pamięci. Oczywiście, że nie działa, dziękuję! –

0

To, co próbujesz zrobić, jest niemożliwe. Nawet jeśli nadpiszesz this, nie wpłynie to na żadną zmienną przechowującą odwołanie do tej instancji. A wywołanie funkcji na niej nadal będzie miało prawidłową wartość this.

Jedyne co możesz zrobić, to ustawić zmienną w swojej funkcji destroy, która spowoduje, że każda inna funkcja wyrzuci wyjątek po wywołaniu. Ale to byłby zły pomysł, ponieważ spowolniłoby to działanie (ok, to pomijalne) i możesz po prostu umieścić w dokumentach swojej klasy, że nie powinno się już z niego korzystać po tym, jak został wywołany.

0

To działa, ale wymaga to, że wiesz, co nazwa zmiennej do której new Klass() jest instancja:

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); 

Jeśli zmienna k nazwie cokolwiek innego to nie działa:

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

Zakłada się także, że lokalna zmienna k znajduje się w zasięgu globalnym. Gdyby znajdował się w funkcji, to też by nie działało. Na przykład:

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

Wreszcie zakłada środowisku przeglądarki dla obiektu window.

+0

Lub możesz przekazać nazwę zmiennej za pomocą parametru 'destroy (ref);' i eval kodu, jeśli to konieczne. –

+0

co, gdybym miał 'a = k' tuż przed' k.destroy() '? Zakładam, że 'a' nadal będzie tam odwoływać się do tej instancji –

+0

@PavelVeller, która jest dokładnie właściwa. Nie twierdzę, że jest to w pełni solidne rozwiązanie. –

1

Chociaż usunięcie własnej instancji obiektu jest możliwe, jest bardzo tandetna. Możesz zapoznać się z artykułem this.

Powiązane problemy