繁体   English   中英

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

[英]why can't I access this.property in my object literal?

我刚刚将我的代码重构为对象并使用this关键字,我遇到了这个问题,设置prop工作,但是当第二个方法触发时, 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);
    }
}

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

更多代码来演示如何调用函数会很有用,但是你可以通过使用它来使它工作:

myObj.SetProp.call(myObj, id)

这种结合MyObj中为this ,对于SetProp函数调用。

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

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

干杯

根据函数的调用方式设置this变量。 当您使用objectReference.method() “点”语法this将自动设置到对象。 您也可以调用一个函数,并明确设定this使用一些其他物体.call().apply()

在你的情况,当你通过this.SetPropSuccess为你传递给函数的引用,当它然后被称为一个回调函数GetJSONAfterStandardLogic()那就不叫在设置方式this给你的对象(最有可能将等于window )。 您可以通过在SetProp()的局部变量中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);
    }
}

通过闭包的魔力, 即使在 SetProp() 完成执行 ,我作为回调传递给GetJSONAfterStandardLogic()的匿名函数也可以访问其包含范围SetProp()的变量。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM