将参数传递给Javascript IIFE构造函数
我试图了解Javascript OO,使用IIFE模块模式模拟一个类:将参数传递给Javascript IIFE构造函数,javascript,inheritance,constructor,iife,Javascript,Inheritance,Constructor,Iife,我试图了解Javascript OO,使用IIFE模块模式模拟一个类: var MyClass = (function() { // Constructor return function() { return { foo: 'foo' } } }()); 我用如下方式传递论点: var MyClass = (function() { // Constructor return function(arg) { return {
var MyClass = (function() {
// Constructor
return function() {
return {
foo: 'foo'
}
}
}());
我用如下方式传递论点:
var MyClass = (function() {
// Constructor
return function(arg) {
return {
foo: function() {
return 'foo'+arg
}
}
}
}());
var init = function(arg) {
this.theArg = arg;
};
为了模仿经典继承,我使用了建议的模式:
到目前为止还不错。我唯一的问题是当我以上述方式进行继承时,理解如何将参数传递给我的类构造函数。我喜欢这样一个事实,在“纯”IIFE模块中,我可以简单地引用其中定义的任何函数中的构造函数参数,从而使它们成为闭包。但是,当我使用构造函数变量添加这些后续函数时,如何访问构造函数参数,如上面的继承示例所示?我想我可以这样做:
var MyClass = (function() {
// Constructor
return function(arg) {
return {
foo: function() {
return 'foo'+arg
}
}
}
}());
var init = function(arg) {
this.theArg = arg;
};
然后我可以在任何后续操作中访问它:
init.prototype = {
foo: function() {
return "foo"+this.theArg;
}
};
对于孩子:
var init = function(arg) {
Base.call(this, arg);
};
这使得外部世界可以使用arg
,因此要使其成为只读,我认为getter可以工作:
var init = function(arg) {
var theArg = arg;
this.getArg = function() { return theArg };
};
从表面上看,我看不出这有什么不对,我想不出更好的选择。有吗?我错过了什么明显的东西吗
我想不出更好的选择了。有吗
不,不在你的例子中
我喜欢这样一个事实,在“纯”IIFE模块中,我可以简单地引用其中定义的任何函数中的构造函数参数,从而使它们成为闭包
您可以在每个函数中访问args
,因为在第一个示例中,您分别在每个对象实例上定义foo
。因此,foo
的每个定义都有一个单独的闭包,其中包含定义时传递的args
这也是唯一可能的,因为foo
是在包含args
的范围内定义的
但在添加这些后续函数时,如何访问构造函数参数。。。在上面的继承示例中
通过使用您找到的经典继承模式,您现在正在构造函数原型上定义foo
函数。这意味着只有一个foo
定义存在,它由使用构造函数创建的所有实例继承。因此,foo
不能再针对每个实例
如图所示,它还意味着foo
不再在包含args
的范围内定义,并且没有直接访问权限
因此,将args
分配给this.thisArgs
是正确的,它允许foo
在每个实例上访问thisArgs
。您已经使foo
成为一个通用的case函数,它可以处理应用它的任何实例
将参数传递给IIFE构造函数:IIFE本身不是构造函数,它只是构建构造函数对象。IIFE的作用域早就在调用构造函数时返回了
我错过了什么明显的东西吗
对。Javascript是一种典型的语言。它从来就不应该像“古典”语言那样。随它去吧。:) 首先,在我看来,您的代码似乎很复杂,如果有的话,几乎没有什么好处。我真的不明白你为什么那样做。其次,您的
init
函数无法访问base
,后者是在inherit
函数中定义的,因此它无论如何都不会运行。第三,我觉得你的整个问题不清楚。我想你对你的继承权的解释都不清楚了。你是不是在问,通过getter函数而不是属性来公开数据是不是一个好主意?@squint这不是我的“真实”代码,只是为了清晰起见,展示我正在使用的模式。我不认为那里有任何不必要的复杂,这些都是“在野外”广泛使用的模式(IIFE模块模式)。继承示例几乎完全是从我链接到的帖子中复制的。但是,重新阅读我写的内容,我认为我在最后一个示例中回答了我自己的问题。我认为这里最好的事情可能是接受JavaScript没有访问修饰符,并将属于该对象的数据直接放在该对象上。这将节省大量的复杂性(并且很容易重写为ES6类,因为您似乎会这样做)。@RyanO'Hara据我所知,使用IIFE模块模式可以实现隐私。在最后一个代码示例中,arg
不能从外部访问,但访问器getArg()
是(我说得对吗?)。但我承认我的问题令人困惑,而且比大量代码示例所显示的更基本。实际上,我只是问如何从IIFE范围之外的另一部分引用用init
定义的变量/属性。答案似乎是这个。我想如果你真的要利用这些iife,它会更有意义,但正如所写的,它们没有真正的用途。简单地创建构造函数并更新它们的原型也没什么不同。此外,所有构造函数都命名为init
,这对控制台中的调试没有帮助。至于野外的代码,有时会出现cargo cult效应,有时您可能会看到从生成器(如TypeScript)创建的代码,为了简单起见,它有时会使用不必要的构造。很难说,谢谢。我所说的“构造函数”实际上是指内部构造函数对象。为不够清晰而道歉。