将参数传递给Javascript IIFE构造函数

时间:2016-01-04 23:40:53

标签: javascript inheritance constructor iife

我试图了解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
      }
    }
  }
}());

为了模仿经典继承,我使用了建议的模式here

function inherit(base, child, obj) {
  child.prototype = Object.create(base.prototype);
  child.prototype.constructor = child;
  obj&&Object.keys(obj).forEach(function(key){
    child.prototype[key] = obj[key];
  })
}

var Base = (function() {

  var init = function() {};

  init.prototype = {
    foo: function() {
      return "foo";
    }
  };

  return init;

}());

var Child = (function() {

  var init = function() {
    Base.call(this); 
  };

  inherit(Base, init, {
    bar: function() {
      return 'bar';
    }
  });

  return init;

}());

到目前为止一切顺利。我唯一的问题是在我以上述方式进行继承时,理解如何将参数传递给我的类构造函数。我喜欢这样一个事实:在纯粹的' IIFE模块我可以简单地在其中定义的任何函数中引用构造函数参数,以便它们成为闭包。但是,如果我使用构造函数变量添加这些后续函数,如何在上面的继承示例中访问构造函数参数?我想我可以做类似的事情:

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 };
  };

从表面上看,我看不出有什么不妥,我无法想到更好的选择。有吗?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

  

我想不出更好的选择。有吗?

没有。不在你的例子中。

  

我喜欢在'纯'IIFE模块中我可以简单地在其中定义的任何函数中引用构造函数参数,以便它们成为闭包。

您可以在每个函数中访问args,因为在第一个示例中,您将分别在每个对象实例上定义foo。因此,foo的每个定义都有一个单独的闭包,其中包含定义时传递的args

这也是唯一可行的,因为foo是在包含args的范围内定义的。

  

但是当我在上面的继承示例中添加这些后续函数时,如何访问构造函数参数?

通过使用您找到的经典继承模式,您现在在构造函数原型上定义foo函数。这意味着只存在一个foo定义,该定义由使用构造函数创建的所有实例继承。因此,foo不能再针对每个实例。

如您所知,这也意味着foo不再在包含args的范围内定义,并且无法直接访问。

因此,您可以args分配this.thisArgs,以便foo允许thisArgs访问每个实例上的foo。您已将chatBox_array.push({key:val_d65f}); 作为一般案例函数,可以处理它所应用的任何实例。

将参数传递给IIFE构造函数: IIFE本身不是构造函数,它只是构建构造函数对象。 IIFE的范围早已在构造函数本身被调用时返回。

  

我错过了一些明显的东西吗?

是。 Javascript是一种原型语言。它从来就不像是“古典”语言。让它成为Javascript。 :)