将参数传递给Javascript 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 {

我试图了解Javascript OO,使用IIFE模块模式模拟一个类:

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)创建的代码,为了简单起见,它有时会使用不必要的构造。很难说,谢谢。我所说的“构造函数”实际上是指内部构造函数对象。为不够清晰而道歉。