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如何处理

相关问题