Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置JavaScript";“类”;使用“内部函数”的属性;这";关键词?_Javascript_Javascript Objects_Revealing Module Pattern - Fatal编程技术网

设置JavaScript";“类”;使用“内部函数”的属性;这";关键词?

设置JavaScript";“类”;使用“内部函数”的属性;这";关键词?,javascript,javascript-objects,revealing-module-pattern,Javascript,Javascript Objects,Revealing Module Pattern,我感到惊讶的是,我找不到更多关于这个话题的内容(可能是我低于标准的搜索技能)。通常,一旦我理解JavaScript关键字“this”是如何工作的,它就会按照我理解的方式停止工作。我将讨论这样一个问题 我的理解是:“当使用‘new’关键字调用函数时……‘this’指的是根函数/‘class’。当从实例化的‘class’内的函数中使用时,这指的是调用函数。”理解这一点非常重要:当从页面上的另一个函数调用函数时,“This”关键字将引用调用函数,而不是目标函数所在的“class” 在下面的示例中,我尝

我感到惊讶的是,我找不到更多关于这个话题的内容(可能是我低于标准的搜索技能)。通常,一旦我理解JavaScript关键字“this”是如何工作的,它就会按照我理解的方式停止工作。我将讨论这样一个问题

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

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

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
更新


我可能应该指出,我使用的是揭示模块模式,希望任何解决方案都是在这种背景下。虽然我确信有许多不同的方法可以做到这一点,但我想重点介绍这种模式的解决方案

试试看这是否是你需要的

 var functionClass = (function(){

        var _isReady = false;

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

        return {

            IsReady: _isReady,
            GetReady: _getReady
        }
    })();
当使用“new”关键字调用函数时此“引用根函数/”类“

否。它指的是一个新实例化的对象,该对象从构造函数函数的
prototype
属性上的对象继承而来。如果函数未显式返回任何表达式,则此对象将是新表达式的结果

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

不,它通常指的是实例

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

不是。同样,它通常指的是实例。尽管它始终取决于函数的调用方式-读取


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

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

functionClass
被分配了一个对象,该对象有两个属性:
GetReady
,该对象被设置为
\u GetReady
函数;和
IsReady
对象,该对象被设置为
\u IsReady
值,即
false
。然而,当调用该方法时,它只会更改
\u IsReady
变量,而不是t他
IsReady
属性的
functionClass

functionClass1
中,您正确地分配了一个属性。但是什么?
\u self
是模块函数中被滥用为构造函数的
值,如上所述,它是从另一个对象继承的对象(其
。构造函数
是用于模块的匿名函数)。它不是您所返回的
functionClass1
对象,正如您所预料的那样

那么如何正确引用该对象呢?最简单的选择是使用其变量名。另一个选择是在getReady函数中使用
this
,如果使用
functionClass.getReady()
调用该对象,则该函数将引用该对象。有关优缺点,请参阅

var functionClass = {
    IsReady: false,
    GetReady: function(){
        // ... do some work to get ready
        this.IsReady = true;
    }
};
functionClass.GetReady();
console.log(functionClass.IsReady);  // true now

如果在不使用new关键字的情况下调用,则如果不以这种方式调用,则引用全局对象:fn.call(ob,param)或fn.apply(ob,params),但functionClass和functionClass1是使用'new'关键字--new functionClass1=new function(){…}实例化的。那么就不需要返回语句。这样做:
\u self.IsReady=\u IsReady;\u self.GetReady=\u GetReady;
我通常使用暴露模块模式,通过匿名对象暴露公共方法和属性。对我来说,我更喜欢能够定义和使用私有成员,并且它可以保持公共接口干净和简单这产生了相同的结果。我把它放进了一个Fiddle()中,实际上发现这是可行的,但是在_getReady()方法定义中,新值必须分配给“This.IsReady”(属性),而不是“_IsReady”(变量).我对这篇文章投了更高的票,因为它引导我朝着正确的方向前进!谢谢!你的例子是一个对象文字,我更喜欢使用显示模块模式,但结合你的解释,你让我明白了我需要去哪里,所以非常感谢你!不过,现在我对“新”的正确用法感到困惑" ... LOLIn在链接问题中展示了某种模块模式(带有
local
变量的示例)。仅当您需要a)构造函数(“init函数”)和b)从公共原型继承时才使用