【问题标题】:JavaScript Module Pattern - How to Create Sub ModulesJavaScript 模块模式 - 如何创建子模块
【发布时间】:2011-10-19 16:17:52
【问题描述】:

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

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

模块.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
    }

}());

【问题讨论】:

  • 除非您在定义子模块之前调用主模块函数,否则我看不出这会是什么问题。但是,您在 module.utils.js 中确实存在语法错误。错字?
  • 这行var Module = Module ? Module : {};的问题是,如果你的子模块在主模块之前加载,主模块的声明之后会擦除子模块的声明,不会抛出异常.

标签: javascript design-patterns module


【解决方案1】:

您的方法没有问题,前提是:

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

附带问题

您的代码当前在以下行有语法错误:

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

【讨论】:

  • 我的主要问题是:在加载Module.Utils 后,如何访问Module 内部的函数C()
  • 关于你的第三个要点,即var Module = Module ? Module : {};这一行的问题,是因为如果子模块在主模块之前加载,主模块的声明将在之后删除子模块的声明,不抛出异常?
  • 啊,我看到你使用模块名称Module.Utils.C(); 来访问子模块Utils 的方法。关键字this 不也可以吗?
【解决方案2】:

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

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

【讨论】:

  • 我看不出 RequireJS 会有什么好处。
  • 更新解释......我认为这很明显。
  • 绝对帮助我清理我的模块......以及我的整个项目,并带来了一大堆其他好处。强烈建议查看此和/或其他模块加载器之一(CommonJs 等)。更进一步,您可以集成 webpack (webpack.github.io),它允许您在同一个项目中一起使用任何模块加载器。
猜你喜欢
  • 2011-05-05
  • 2011-07-02
  • 2021-06-26
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
相关资源
最近更新 更多