设置JavaScript";“类”;使用“内部函数”的属性;这";关键词?
我感到惊讶的是,我找不到更多关于这个话题的内容(可能是我低于标准的搜索技能)。通常,一旦我理解JavaScript关键字“this”是如何工作的,它就会按照我理解的方式停止工作。我将讨论这样一个问题 我的理解是:“当使用‘new’关键字调用函数时……‘this’指的是根函数/‘class’。当从实例化的‘class’内的函数中使用时,这指的是调用函数。”理解这一点非常重要:当从页面上的另一个函数调用函数时,“This”关键字将引用调用函数,而不是目标函数所在的“class” 在下面的示例中,我尝试了两种方法从公共函数设置变量。两者都失败了。我正试图理解为什么会这样,以及如何使这项工作设置JavaScript";“类”;使用“内部函数”的属性;这";关键词?,javascript,javascript-objects,revealing-module-pattern,Javascript,Javascript Objects,Revealing Module Pattern,我感到惊讶的是,我找不到更多关于这个话题的内容(可能是我低于标准的搜索技能)。通常,一旦我理解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)从公共原型继承时才使用