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?
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? –
Miałem drobny błąd. Zaktualizowano odpowiedź. – galambalazs
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. –