为什么我不能在我的对象文字中访问this.property?

时间:2012-03-08 23:15:28

标签: javascript jquery

我刚刚将我的代码重构为对象并使用this关键字,我遇到了这个问题,设置道具工作,但是当第二个方法触发时,myProp未定义。我注意到我是否使用myObj来设置和获取而不是它可以正常工作。这有什么区别?我究竟做错了什么?我虽然这是指其中只有一个由对象文字自动实例化的实例。

var myObj = {
    SetProp: function (id) {
        this.myProp = "abc";
        Ajax.GetJSONAfterStandardLogic(Utility.PrefixURL("/ajax/mymethod"), this.SetPropSuccess);
    },
    SetPropSuccess: function (response) {
        console.log("test " + this.myProp);
    }
}

3 个答案:

答案 0 :(得分:1)

可能因为当你调用这些函数时,this不是对象。 this是调用函数的绑定。

用于演示如何调用该函数的更多代码将非常有用,但您可以使用以下命令使其工作:

myObj.SetProp.call(myObj, id)

这将myObj绑定为this,用于SetProp函数调用。

如果您将console.log(this)放入其中任何一个函数中,您可能会发现this不是您所期望的。

答案 1 :(得分:1)

执行回调函数时,它的范围不同。因此,“this”引用了范围,并且未定义“myProp”。这就是使用myObj.myProp工作的原因 - 范围仍然有效。

干杯

答案 2 :(得分:1)

根据函数的调用方式设置this变量。当您使用objectReference.method()" dot"语法this将自动设置为该对象。您还可以使用this.call()调用函数并将.apply()显式设置为其他对象。

在您的情况下,当您将this.SetPropSuccess作为回调函数传递时,您将传递对该函数的引用,然后在GetJSONAfterStandardLogic()调用它时,它不会以设置{{}的方式调用1}}到你的对象(很可能它将等于this)。您可以通过在window

的局部变量中保存对象的引用来解决此问题
SetProp()

通过闭包的魔力,我作为回调传递给var myObj = { SetProp: function (id) { var self = this; this.myProp = "abc"; Ajax.GetJSONAfterStandardLogic(Utility.PrefixURL("/ajax/mymethod"), function() { self.SetPropSuccess(); }); }, SetPropSuccess: function (response) { console.log("test " + this.myProp); } } 的匿名函数可以访问其包含范围GetJSONAfterStandardLogic() 中的变量,即使在< / em> SetProp() 已完成

最重要的是,你必须习惯JavaScript中的SetProp()与它在基于类的OO语言(如Java和C#)中的工作方式有很大不同。 JavaScript仍然是OO,但这些差异通常会使人们从Java或C#中获取语言。

进一步阅读:https://developer.mozilla.org/en/JavaScript/Reference/Operators/this