无法在JavaScript中使用"class"方法进行回调

Car*_*ers 7 javascript ajax prototype callback

我正忙着用Java包围原型.

以前我在调用这样的东西时遇到了麻烦:

o = new MyClass();
setTimeout(o.method, 500);
Run Code Online (Sandbox Code Playgroud)

我被告知我可以使用以下方法修复它:

setTimeout(function() { o.method(); }, 500);
Run Code Online (Sandbox Code Playgroud)

这很有效.我现在遇到了一个不同的问题,我想我可以用同样的方式解决它,只需要放入一个匿名函数.我的新问题是:

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

MyClass.prototype.some_callback(data) {
    console.log("received data! " + data);
    this.open();
}
Run Code Online (Sandbox Code Playgroud)

我发现,内体MyClass.prototype.some_callbackthis关键字不参照实例的MyClass该方法被调用时,而这似乎是jQuery的Ajax请求(这是一个包含XHR对象的对象和所有参数我的ajax电话,除其他外).

我试过这样做:

$.ajax({
    /* ... */
    success: function() { this.some_callback(); },
});
Run Code Online (Sandbox Code Playgroud)

但我得到错误:
Uncaught TypeError: Object #<an Object> has no method 'handle_response'

我不确定如何正确地做到这一点.我是JavaScript的新手和原型的概念 - 有时类似行为的类 - 但通常不会让我感到困惑.

那么这样做的正确方法是什么?我是否试图强制JavaScript进入一个不属于它的范例?

gbl*_*zex 16

我是否试图强制JavaScript进入一个不属于它的范例?

当你谈论类是的时候.

那么这样做的正确方法是什么?

首先,您应该了解this关键字可以包含哪种值.

  1. 简单的函数调用

    myFunc();- this将引用全局对象(又名window)[1]

  2. 函数调用作为对象的属性(又称方法)

    obj.method();- this会参考obj

  3. 函数调用new运算符

    new MyFunc();- this将参考new instance正在创建的

现在让我们看看它如何适用于您的情况:

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

如果要调用some_callback当前实例的方法,则应该保存对该实例的引用(对于一个简单的变量).

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
    });                             
}
Run Code Online (Sandbox Code Playgroud)

[1]请注意,在新版本(ES 5 Str.)案例1将导致this价值undefined

[2]还有一种情况是你使用callapply调用给定的函数this