2013-07-03 89 views
3

我想使用揭示模块模式设置一些代码。 我想设置子模块,以便能够访问主模块的私有功能,但我坚持如何做到这一点。揭示模块模式添加子模块和访问私人功能

下面是一些示例代码,香港专业教育学院一直在玩:

var Module = (function() { 

    function B(){ 
     console.log("B"); 

    }; 

    return { 
     //B: B 
    }; 

})(); 

var Module = Module || {}; 

Module.Utils = (function() { 

    function C() { 

     B(); 
    }; 

    return { 
     C: C 
    } 

}).apply(Module); 

Module.Utils.C(); 

哪能让这个我可以从utils的模块调用私有函数?

编辑:

仅仅指刚澄清我希望能够创建一个被添加到主模块的子模块,所以如果它可以帮助子模块可模块为好。我正在阅读:http://www.sitepoint.com/modular-design-patterns-in-javascript/它使用apply()添加第二个模块,但必须使用扩展和私有化功能将模块添加到主模块。如果可能的话,我想远离?

另一编辑 总之,我想有一个主模块和第二个模块在一个新的文件,只在一个部分使用。我需要第二个模块仍然能够引用主要模块的私有功能。这可能吗?

这里是代码我提到:

//protected utility functions 
    utils = 
    { 
     //add properties to an object 
     extend : function(root, props) 
     { 
      for(var key in props) 
      { 
       if(props.hasOwnProperty(key)) 
       { 
        root[key] = props[key]; 
       } 
      } 
      return root; 
     }, 

     //copy an object property then delete the original 
     privatise : function(root, prop) 
     { 
      var data = root[prop]; 
      try   { delete root[prop]; } 
      catch(ex) { root[prop] = null; } 
      return data; 
     } 
    }; 
+0

你问你为什么不能从'C()'调用'B()'? – Matt

+2

你不能,它是**私人**?你将不得不导出它,并调用'Module.B' – Bergi

+0

我已经编辑了上面的内容,试图澄清一下id做什么 – Lee

回答

4

除非你定义在同一个词法范围为父模块的子模块,并做某种封闭在“父”私人的功能,你可以“T。您将这些功能设置为私人,所以您需要能够看到他们给他们打电话。在与父模块不同的位置定义子模块时,您无法看到它们。你会得到你想要的结构的唯一方法是这样的:

var Module = (function() { 
    function B() { 
     console.log("B"); 
    }; 

    var Utils = (function() { 
     function C() { 
      B(); 
     }; 

     return { 
      C: C 
     } 
    })() 

    return { 
     Utils: Utils 
    }; 
})(); 
+0

我期待有第二个模块在一个单独的文件,所以它是不可能做什么哟建议这是一个耻辱。 – Lee

+0

剩下的唯一可能就是将变量作为非私有变量,捕获它,然后将其从父模块中移除。这将是一个主要的黑客攻击,并且使你的代码复杂化。最终,让它变得非私密并保持您的实施更清洁会更好。 – Matt