2010-10-25 59 views
5

我有一段非常艱難的時光,用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 #<an Object> has no method 'handle_response'

我不知道如何正確地做到這一點。我是JavaScript新手,原型的概念 - 有時 - 類行爲 - 類 - 但通常 - 不會讓我感到困惑。

那麼這樣做的正確方法是什麼?我是否試圖強制JavaScript進入它不屬於的範式?

回答

12

Am I trying to force JavaScript into a paradigm which it doesn't belong?

當你在談論類是的。

So what is the right way to do this?

首先,你應該學會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 
} 

如果你想調用當前實例的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大街)案例1會導致this是價值undefined

[2]還有另一種情況下,你使用callapply調用函數與給定this

+0

沒關係,我想這一點,但我的結果是一樣的:調用'some_callback'作品,但'some_callback'的'this'內指的是一您在第一個代碼示例中突出顯示的jax請求對象。我怎樣才能在回調中調用'some_callback','this'會引用設置回調的'MyClass'對象? – 2010-10-25 20:50:01

+0

我有一個小錯誤。更新了答案。 – galambalazs 2010-10-25 21:02:36

+0

您更新的示例像魅力一樣工作。我以爲我已經嘗試過了,它不起作用......我想我早些時候嘗試過這種方法時犯了一個錯誤。 – 2010-10-25 21:03:21