代码之家  ›  专栏  ›  技术社区  ›  Carson Myers

无法在JavaScript中对回调使用“类”方法

  •  5
  • Carson Myers  · 技术社区  · 14 年前

    我真的很难用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和原型的概念还不太熟悉,它们有时表现得像类,但通常不会让我感到困惑。

    1 回复  |  直到 14 年前
        1
  •  16
  •   gblazex    14 年前

    我是不是想强迫JavaScript进入一个不属于它的范例?

    当你在谈论课程的时候是的。

    那么正确的方法是什么呢?

    首先,你应该了解什么样的价值观 this

    1. 简单函数调用

      myFunc(); 将引用全局对象(aka window )[一]

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

      obj.method(); - 将参考 obj

    3. 与新运算符一起调用函数

      new MyFunc(); - 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
    }
    

    如果你想打电话 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
        });                             
    }
    

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

    [2] 还有一个例子你用 call apply 使用给定的