У меня действительно тяжелое время, когда я заворачиваюсь в прототипы на JavaScript.
Раньше у меня были проблемы с вызовом что-то вроде этого:
o = new MyClass();
setTimeout(o.method, 500);
и мне сказали, что я могу это исправить, используя:
setTimeout(function() { o.method(); }, 500);
И это работает. Теперь у меня другая проблема, и я подумал, что могу решить ее таким же образом, просто добавив анонимную функцию. Моя новая проблема заключается в следующем:
MyClass.prototype.open = function() {
$.ajax({
/*...*/
success: this.some_callback,
});
}
MyClass.prototype.some_callback(data) {
console.log("received data! " + data);
this.open();
}
Я обнаружил, что в теле MyClass.prototype.some_callback
ключевое слово this
относится не к экземпляру MyClass
, к которому был вызван метод, а к тому, что выглядит как запрос jQuery ajax (это объект, который, помимо прочего, содержит объект xhr и все параметры моего вызова ajax).
Я пытался сделать это:
$.ajax({
/* ... */
success: function() { this.some_callback(); },
});
но я получаю ошибку:
Uncaught TypeError: Object #<an Object> has no method 'handle_response'
Я не уверен, как правильно это сделать. Я новичок в JavaScript, и концепция прототипов, которые иногда ведут себя как классы, но обычно не делают, меня действительно смущает.
Так каков правильный способ сделать это? Пытаюсь ли я принудить JavaScript к парадигме, которой он не принадлежит?