2010-10-25 18 views
5

Mam naprawdę ciężki czas owijając głowę prototypami w JavaScript.Nie można użyć metod "klasy" dla wywołań zwrotnych w JavaScript

Wcześniej miałem problemy wzywającą coś takiego:

o = new MyClass(); 
setTimeout(o.method, 500); 

i powiedziano mi, że mogę to naprawić za pomocą:

setTimeout(function() { o.method(); }, 500); 

I to działa. Teraz mam inny problem i pomyślałem, że mogę rozwiązać go w ten sam sposób, po prostu rzucając anonimową funkcję. Mój nowy problem jest taki:

MyClass.prototype.open = function() { 
    $.ajax({ 
     /*...*/ 
     success: this.some_callback, 
    }); 
} 

MyClass.prototype.some_callback(data) { 
    console.log("received data! " + data); 
    this.open(); 
} 

jestem stwierdzenia, że ​​w ciele MyClass.prototype.some_callback słowo kluczowe this nie odnosi się do instancji MyClass którym metoda została wywołana, ale raczej to, co wydaje się być jQuery wniosek ajax (to obiekt, który zawiera obiekt xhr i wszystkie parametry mojego wywołania ajax, między innymi).

Próbowałem w ten sposób:

$.ajax({ 
    /* ... */ 
    success: function() { this.some_callback(); }, 
}); 

ale pojawia się błąd:
Uncaught TypeError: Object #<an Object> has no method 'handle_response'

nie jestem pewien, jak prawidłowo to zrobić. Jestem nowicjuszem w JavaScript i koncepcja prototypów - takich, które czasami przypominają - zachowują-jak-klasy-ale-zwykle-nie-naprawdę mnie dezorientują.

Co jest właściwym sposobem na zrobienie tego? Czy próbuję zmusić JavaScript do paradygmatu, do którego nie należy?

Odpowiedz

12

Am I trying to force JavaScript into a paradigm which it doesn't belong?

Kiedy mówisz o klasach tak.

So what is the right way to do this?

Po pierwsze, należy nauczyć się, jakie wartości słowa kluczowego this może zawierać.

  1. Proste wywołanie funkcji

    myFunc(); - this będzie odnosić się do globalnego obiektu (aka window) [1] wezwanie

  2. Funkcja jako właściwość obiektu (aka metoda)

    obj.method(); - this będzie patrz obj

  3. wywołanie funkcji wzdłuż wit nowego operatora

    new MyFunc(); - this skieruje do new instance tworzone

Teraz zobaczmy jak to odnosi się do sprawy:

MyClass.prototype.open = function() { 
    $.ajax({ // <-- an object literal starts here 
     //... 
     success: this.some_callback, // <- this will refer to that object 
    });  // <- object ends here 
} 

Jeśli chcesz wywołać some_callback metodę bieżącej instancji powinieneś zapisać referencję do tej instancji (do prostej zmiennej).

MyClass.prototype.open = function() { 
    var self = this; // <- save reference to the current instance of MyClass 
    $.ajax({ 
     //... 
     success: function() { 
      self.some_callback(); // <- use the saved reference 
     }       // to access instance.some_callback 
    });        
} 

[1] Proszę zwrócić uwagę, że w nowej wersji (ES 5 Str.) Przypadek 1 spowoduje this być wartością undefined

[2] Jest jeszcze jeden przypadek, w którym używać call lub apply wywołanie funkcji z danym this

+0

porządku, próbowałem, ale mój wynik jest taki sam: wywołanie 'prac some_callback', ale' this' wewnątrz 'some_callback' odnosi się do a Obiekt żądania jax, który został podświetlony w pierwszym przykładzie kodu. Jak mogę wywołać 'some_callback' w taki sposób, że w ramach wywołania zwrotnego' this' będzie odnosić się do obiektu 'MyClass', który ustawia wywołanie zwrotne? –

+0

Miałem drobny błąd. Zaktualizowano odpowiedź. – galambalazs

+0

Twój zaktualizowany przykład działa jak urok. Myślałem, że już to wypróbowałem i to nie działało ... Przypuszczam, że popełniłem błąd, gdy wcześniej próbowałem tej metody. –

Powiązane problemy