0

我很惊讶我找不到关于这个话题的更多信息(可能是我的搜索技能低于标准)。通常,一旦我认为我理解了 JavaScript 关键字的工作原理,“this”就会按照我理解的方式停止工作。我将解决一个这样的问题。

我的理解:“当使用'new'关键字调用函数时......'this'指的是根函数/'class'。当从实例化的'class'中的函数使用时,它指的是CALLING函数”。-- 理解这一点非常重要:当从页面上的另一个函数调用函数时,“this”关键字将引用调用函数,而不是目标函数所在的“类”。

在下面的示例中,我尝试了两种从公共函数设置变量的方法。两者都失败了。我试图理解为什么会这样以及如何使它工作。

var functionClass = new function(){

    var _isReady = false;

    var _getReady = function(){
        // ... do some work to get ready
        _isReady = true;
    }

    return {

        IsReady: _isReady,
        GetReady: _getReady
    }
}



var functionClass1 = new function () {

    var _isReady = false;
    var _self = this;

    var _getReady = function () {
        // ... do some work to get ready
        _self.IsReady = true;
    }

    return {

        IsReady: _isReady,
        GetReady: _getReady
    }
}


functionClass.GetReady();
functionClass1.GetReady();

console.log(functionClass.IsReady);  // Expect true ... I get false
console.log(functionClass1.IsReady); // Expect true ... I get false

更新

我可能应该指出我正在使用显示模块模式,并且希望任何解决方案都在这种情况下。虽然我确信有多种不同的方法可以做到这一点,但我想将解决方案集中在这种模式上。

4

2 回答 2

1

试试这个看看这是否是你需要的

 var functionClass = (function(){

        var _isReady = false;

        var _getReady = function(){
            // ... do some work to get ready
            _isReady = true;
        }

        return {

            IsReady: _isReady,
            GetReady: _getReady
        }
    })();
于 2013-06-18T13:29:49.990 回答
0

当使用'new'关键字调用函数时......'this'指的是根函数/'class'

不,它是指从构造函数属性上的对象继承的新实例化对象prototypenew如果没有从函数显式返回,则此对象将是 - 表达式的结果。

当从实例化的“类”中的函数中使用时,这指的是 CALLING 函数“

不,它通常指的是实例。

当从页面上的另一个函数调用该函数时,“this”关键字将引用调用函数,而不是目标函数所在的“类”

不。同样,它通常指的是实例。虽然它总是取决于函数的调用方式——阅读MDN 对this关键字的介绍。


在您的情况下,您根本不应该使用模块创建new。任何地方都不涉及继承。将其更改为立即执行的函数表达式(IEFE,您可以搜索)。

那么为什么你的两次尝试现在都失败了?

被分配了一个对象,该functionClass对象具有两个属性:GetReady设置为_getReady函数,IsReady设置为 的值_isReady,即false。但是,当您调用该方法时,它只会更改_isReady变量,而不会更改IsReady.functionClass

functionClass1您正确分配给属性时。但是呢?_selfthis作为构造函数被滥用的模块函数的值,如上所述,它是从另一个对象继承的对象(该对象.constructor是用于模块的匿名函数)。它不是——正如你所预料的——functionClass1你所做的对象return

那么如何正确引用该对象呢?好吧,最简单的选择是使用它的变量名。另一种选择是this在 getReady 函数中使用,如果使用 调用,它将引用该对象functionClass.GetReady()。请参阅Javascript: Object Literal reference in own key's function 而不是 'this'了解利弊。

var functionClass = {
    IsReady: false,
    GetReady: function(){
        // ... do some work to get ready
        this.IsReady = true;
    }
};
functionClass.GetReady();
console.log(functionClass.IsReady);  // true now
于 2013-06-18T13:34:29.697 回答