2013-03-13 43 views
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"); 
    }; 

...沒有觸及它的上述模塊,即我不想更改Module的現有代碼,但將其擴展爲具有新的C屬性。

+0

這是一個很好的問題,但我通過它的一個組成部分混淆。從你的代碼的註釋中你指出你的問題出在哪裏,看起來你實際上想擴展你的代碼中沒有定義的'Module'的'Utils'屬性。那麼你想擴展'Module'還是一個名爲'Utils'的對象應該屬於'Module'? – guypursey 2013-03-13 10:32:20

+0

另一個問題:「Utils」還是「C」應該是私密的還是公開的?它們是否應該享有特權(即,可以在您的關閉中訪問私有變量)? – guypursey 2013-03-13 10:33:42

回答

0

您可以添加方法來dynamicaly對象:

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

只要C不想訪問閉包中定義的任何變量或函數,就是如此。這是模塊模式的主要目的,不是嗎? – zeroflagL 2013-03-13 09:54:09

2

你需要做的模塊定義後,執行以下操作:

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

第一線檢查Module.Utils是否已經定義並如果不是,則定義它。接下來的部分然後分配函數C.

如果你試圖只做Module.Utils.C = function(){ console.log("C"); };那麼你會得到一個有關Module.Utils未定義的錯誤。

我已經在這裏創造一個小提琴顯示它的工作:http://jsfiddle.net/u5R4E/

相關問題