2016-08-03 55 views
1

有沒有一種方法可以以與構造函數相同的方式將參數傳遞給模塊?模塊模式中的構造函數參數

我已經能夠找到的答案似乎暗示了一個setter函數。這對我不起作用,因爲我的模塊的邏輯取決於設置的全局變量,如果沒有使用依賴於「未設置」變量的代碼實例化模塊,則無法調用setter。

具體而言,我試圖'模塊化'一個D3圖通常是有用的,並希望能夠實例化模塊與數據數組參數。

編輯:對於d3圖,事實證明模塊模式效果最好。沒有什麼是需要與不能只在後面的更新功能通過一個數據參數進行實例化......

但是總體來說,如果我有這個模塊:

var thing = (function() { 

var a = [1,2,3]; 
var l = a.length; 

var doit = function() { 
    console.log('your array has '+l+' elements'); 
} 
var doit2 = function() { 
    console.log('your array contains: '+a.toString()); 
} 
return { 
    doit: doit, 
    doit2: doit2 
    } 
})(); 

如何傳遞的數組用來代替var a?

+0

'VAR的事情=(函數(PARAM){VAR一個=參數;/*等* /})(dataArray);'? – nnnnnn

+0

*'如果沒有使用依賴於「un-set」變量的代碼來實例化模塊,則無法調用setter *。* - 在您的示例模塊中,添加'.init()'或setter方法不會有任何問題。您可以將'a'默認設置爲空數組,並將其設置爲'.init()'或setter方法中的* real *值,如果客戶端代碼嘗試調用'doit()'而不調用' .init()'然後它會得到它應得的。 – nnnnnn

+0

如果它是一個模塊,一個靜態的全局單例,那麼將它作爲參數傳遞給IIFE還是簡單地將其放入body中並沒有什麼區別。如果您希望它可以重新使用,請改爲使用工廠或構造函數。 – Bergi

回答

1

你可以做這樣的事情(注意IIFE釋放):

var thingCreator = function (param) { 
    // your code 
    return { 
     // your module object 
    }; 
}; 

然後調用它像:

var thing = thingCreator(a); 
+0

我認爲這可能工作,這真的只是一個工廠功能? – oraz

+0

這只是一個工廠功能。您也可以將參數傳遞給IIFE,具體取決於您何時需要提供的值。 – Michael

相關問題