JavaScript模块模式-返回的对象===模块||facade

JavaScript module pattern - returned object === module || facade

本文关键字:模块 facade 对象 返回 模式 JavaScript      更新时间:2023-09-26

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

var module = function (args) {
    //private members
    return {
         //public members
    };
};
var module_instance = module (args);   // module instance or facade instance?

这个实施有什么问题吗?有没有一种不同的、更有效的方法来做到这一点?

此外,在前面的代码块之后,如果我再次调用该函数并将返回的值指定给另一个变量:,会怎么样

var module_instance2 = module (args);

这是否意味着我现在有了这个函数的第二个外观,或者它是一个全新的函数?

干杯!

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

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

最好。

模块模式类似于其他语言中的名称空间,用于防止全局变量污染,并作为一种封装方法。

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

看看AMD和CommonJS模块,或者Addy Osmani的一篇文章。