JavaScript模块模式 - 返回对象===模块||正面

时间:2014-04-24 19:29:00

标签: javascript design-patterns web module

我在这里有点困惑。遵循JS中的模块模式,模块通常是来自立即执行的匿名函数的返回对象。但是,如果我不想执行该功能,而是在需要时调用它,该怎么办? window.onload

var module = function (args) {
    //private members

    return {
         //public members
    };
};

var module_instance = module (args);   // module instance or facade instance?

此实施有任何问题吗?有没有不同的,更有效的方法来做到这一点?

此外,按照previos代码块,如果我再次调用该函数并将返回的值作为另一个变量,该怎么办:

var module_instance2 = module (args);

这是否意味着我现在拥有该功能的第二个外观,或者它是一个新功能?

干杯!

2 个答案:

答案 0 :(得分:1)

该函数是模块的构造函数,因此每次调用该函数时,都会创建一个新的单独模块实例并将其分配给接收变量。

此实现没有任何问题(实际上它非常常见),您可以在程序中的任何位置使用它来获取该模块的新实例。

最佳。

答案 1 :(得分:0)

模块模式类似于其他语言中的命名空间,用于防止全局变量污染和封装方法。

window.module1 = (function() {} {
  var version = "0.0.1";
  function func1 () {};
  function func2 () {};

  return = {
    version: version,
    func1: func1,
    func2: func2,
  };
})()

您可以使用函数DeclareModule()在窗口对象上定义模块。

var DeclareModule = function(name, content) {
  if (typeof content === 'object') {
    window[name] = content;
  } else if (typeof content === 'function') {
    window[name] = content();
  }
};

//Declared by object
DeclareModule("module1", {
  version: "0.0.1",
  func1: function () {},
  func2: function () {}
});

//Declared by function
DeclareModule("module1", function () {
  var version = "0.0.1";
  function func1 () {};
  function func2 () {};

  return {
    version: version,
    func1: func1,
    func2: func2
  };
});

查看AMDCommonJS modules,或article by Addy Osmani