JavaScript模块模式 - 如何创建子模块

时间:2011-10-19 16:17:52

标签: javascript design-patterns module

如何根据模块模式访问/创建子模块?

我希望能够从Modules.js主文件中的子模块访问方法。

Module.js

var Module = (function() {

    function A(){
      console.log("Module: A");
      B();
    };

    function B(){
       console.log("Module: B");
       Module.Utils.C(); /* Here is the problem */
    };

    return {
      A:A,
      B:B
    }

} ());

$(function() {
    Module.A();
});

Module.Utils.js

var Module = Module ? Module : {};

Module.Utils = (function() {

    var settings = {
        x : 1,
        y : 2
    };

    function C(){
      console.log("Module.Utils: C");
    };

    function D(){
       console.log("Module.Utils: D");
    };

    return {
      C:C,
      D:D
    }

}());

2 个答案:

答案 0 :(得分:8)

你的方法没有错,提供:

  • 您在模块脚本
  • 之后加载子模块脚本
  • 在加载子模块脚本
  • 之前,不要尝试访问它
  • 您可以使主模块依赖于子模块的存在。 (我不确定这是个好主意。)

侧面问题

您的代码目前在以下行中出现语法错误:

var Module.Utils = (function() {

分配前不应有var个关键字。

示例代码

这是您的代码的简化版本 - 剥离以仅显示我正在调用的方法 - 这表明您的方法有效:

var Module = (function() {

    function B() {
        console.log("Module: B");
        Module.Utils.C(); /* accessing submodule public methods */
    };

    return {
        B: B
    };

})();

var Module = Module || {};

Module.Utils = (function() {

    function C() {
        console.log("Module.Utils: C");
    };

    return {
        C: C
    }

})();

Module.B();

输出:

Module: B
Module.Utils: C

答案 1 :(得分:3)

您应该考虑使用像RequireJS这样的实际模块框架。

“子模块”只是一个位于module/utils的模块,而您的module模块将需要它作为依赖项,RequireJS会为您解决这个问题。