2012-02-24 54 views
2

我想創建一個JavaScript對象,如下所示。在不同的上下文中的JavaScript'this'

var MyObject = function (parameters) { 
    this.parameters = parameters; 
    parameters.userFunction(this.MyObjectCallback); 
} 

MyObject.SOME_STATIC_VARIABLE = 21; 

MyObject.prototype = { 
    myObjectCallback: function() { 
     console.log(this); 
    } 
} 

MyObject對象將接受它將傳遞處理程序的userFunction。用戶函數會做一些邏輯,並將結果傳遞迴實例,例如:

new MyObject({userFunction: function(callback) { 
    $.post(
     'http://localhost/~knyttl/source.php', 
     {}, 
     callback, 
     'json');, 
}}); 

不幸的是,即使callback正確調用,this得到JQuery對象的實例,而不是MyObject實例如我所願。總之,我無法保持MyObject實例。

我甚至不確定這是否是創建JavaScript對象的正確方法。我會很感激任何建議。

回答

5

您可以使用.bind綁定特定的this值。我還修正了大寫的My

parameters.userFunction(this.myObjectCallback.bind(this)); 

當你調用像a.b()一個功能,那裏面bthis === a。但是,如果您直接調用而不是,但只能通過該函數(如a.b)並稍後調用它,則此綁定將丟失。

.bind返回一個新函數,現在接收jQuery ajax結果爲this。但是,它會忽略並使用預定義(綁定)this調用myObjectCallback

.bind在舊版瀏覽器上不可用,但有墊片可用。

0

的jQuery允許你設置你的回調context

你處於一個奇怪的情況,你的設計傷害了你。您的MyObject無法作爲上下文傳入,因爲它正在同時創建。

new MyObject({userFunction: function(callback) { 
    $.post(
     'http://localhost/~knyttl/source.php', 
     {}, 
     callback, 
     'json');, 
}}); 

所以不是:

var myObj = new MyObejct(); 
myObj.setCallback({userFunction: function (callback) { 
    $.ajax({ 
     context: myObj, 
     url: 'http://localhost/what ever /', 
     success: callback, 
     dataType: 'json', 
     data: {} 
    } 
}); 
0

使用的JavaScript 這個必須非常混淆的可能性。當函數被調用時,它被賦予點後的任何值的值,例如,

window.doSomething(); 

將導致被設置爲窗口,而

myDOMElement.onClick(); 

將導致設置爲myDOMElement。

就你而言,歸結爲JQuery的內部工作原理,因此請看this very thorough set of explanations以瞭解JQuery如何處理

相關問題