向现有的模块化模式对象添加新方法

5
我有一个包含两个方法 A()B() 的模块:
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
    }

} ());

假设我想添加一个新方法C()...

function C(){
      console.log("C");
    };

我希望你能将新的C属性添加到上述模块中,而不需要对其进行更改,即我不想改变Module现有的代码,只是想扩展它以拥有新的C属性。


这是一个很好的问题,但其中一部分让我感到困惑。从你代码中的注释部分来看,你指出了问题所在,似乎你实际上想要扩展ModuleUtils属性,而这在你的代码中并没有定义。那么你是想要扩展Module还是属于Module的名为Utils的对象? - guypursey
另一个问题:UtilsC 应该是私有的还是公共的?它们应该是特权的(即,可以访问闭包中的私有变量)吗? - guypursey
2个回答

2
你需要在模块定义之后执行以下操作:
Module.Utils = Module.Utils || {};
Module.Utils.C = function(){
  console.log("C");
};

第一行检查是否已经定义了Module.Utils,如果没有定义,则定义它。接下来的部分将函数C赋值给它。
如果你尝试只做Module.Utils.C = function(){ console.log("C"); };,那么你会得到一个关于Module.Utils未定义的错误。
我在这里创建了一个演示它工作的fiddle:http://jsfiddle.net/u5R4E/

0

您可以动态地向对象添加方法:

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

2
只要C不想访问闭包内定义的任何变量或函数,这就是正确的。而这也是模块模式的主要目的,不是吗? - a better oliver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接