为什么可以't我在对象文字中访问this.properties

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

本文关键字:文字 对象 访问 properties this 为什么      更新时间:2023-09-26

我刚刚将代码重组为对象,并使用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.myDrop有效的原因-作用域仍然有效。

干杯

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

在您的情况下,当您将this.SetPropSuccess作为回调函数传递时,您正在传递对该函数的引用,而当GetJSONAfterStandardLogic()调用它时,它不会以将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(),即使在SetProp()完成执行之后,它也可以访问其包含范围SetProp()中的变量。

最重要的是,您必须习惯JavaScript中的this的工作方式与Java和C#等基于类的OO语言中的工作方式截然不同。JavaScript仍然是OO,但这些差异通常会让人们从Java或C#开始使用这种语言。

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