JavaScript'this'在不同的上下文中

时间:2012-02-24 13:45:54

标签: javascript oop

我正在尝试按如下方式创建JavaScript对象。

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 个答案:

答案 0 :(得分:5)

您可以使用this绑定特定的.bind值。我还纠正了My的大写。

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

当您调用类似a.b()的函数时,请调用bthis === a。但是,如果您直接调用它但只传递函数(如a.b)并稍后调用它,则此绑定将丢失。

.bind返回一个新函数,现在接收jQuery ajax结果为this。但是,它会忽略它并使用预定义(绑定)myObjectCallback调用this

.bind在旧版浏览器上不可用,但有可用垫片。

答案 1 :(得分:0)

请参阅apply() and call()

parameters.userFunction.call(this, this.MyObjectCallback);

答案 2 :(得分: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: {}
     }
});

答案 3 :(得分:0)

试试这个。

            var myObject = {

                obj1:function(paremeters){
                    this.Name = paremeters
                    return this},
                };

我建议你读一下, http://javascript.crockford.com/javascript.html

答案 4 :(得分:0)

在javascript中使用可能会非常混乱。当调用函数时,它被赋予点后面的任何值。

window.doSomething();

会将设置为窗口,而

myDOMElement.onClick();

会将设置为myDOMElement。

在您的情况下,它归结为JQuery的内部工作原理,因此请查看this very thorough set of explanations以了解JQuery如何处理