2013-07-03 120 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