Невозможно использовать методы «класса» для обратных вызовов в JavaScript

Мне очень тяжело заниматься прототипами в 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 # не имеет метода handle_response

Я не уверен, как это правильно сделать. Я новичок в JavaScript, и концепция прототипов, которые иногда ведут себя как классы, но обычно не работают, действительно сбивает меня с толку.

Итак, как правильно это сделать? ? Я пытаюсь навязать JavaScript парадигму, которой он не принадлежит?

7
задан Carson Myers 25 October 2010 в 20:45
поделиться