2014-01-23 26 views
0

我想要一個特定的函數來創建一個網格,並在每個插槽中插入一個唯一的對象。這裏的關鍵是,函數應該接受構造函數作爲參數(因爲可能需要通過此函數調用多個構造函數),但實例化多個對象。Javascript:通過構造函數作爲參數,函數只實例化一個對象

現在,我有:

//constructor 
function NewObj(){ 
...some stuff 
} 

//function to construct. Needed since grid function accepts non-constructors as well 
function buildNewObj(){ return new NewObj();} 

//here is the grid function that takes size and which data to pre-insert as parameters 
function newGrid(rows,cols,dataFunction){ 

var customGrid = []; 

for(row=0;row<rows;row++){ 
     var customRow = []; 
     for(col=0;col<cols;col++){ 
      var data = dataFunction; 
      customRow.push(data); 
     } 
     customGrid.push(customRow); 
} 

return customGrid; 
} 

調用:

var myGrid = newGrid(3,3,buildNewObj()); 

myGrid的結果是一個3x3的網格,所有鏈接到同一個對象。如果我在buildNewObj()函數中放置一個Alert()並運行它,則該警報只顯示一次。

如果我們改變內newGrid代碼不採取構造函數作爲參數,而是直接引用它,如下所示:

var data = buildNewObj(); 

,而不是

var data = dataFunction; 

然後每個插槽的網格內獲得自己獨特的對象。

如何在通過參數傳遞構造函數的同時在網格的每個插槽中獲取唯一對象?

謝謝!

回答

0

buildNewObject作爲函數傳遞,而不是調用它並傳遞其結果。

function newGrid(rows,cols,dataFunction) { 
    var customGrid = []; 
    for (var row=0;row<rows;row++){ 
     var customRow = []; 
     for (var col=0;col<cols;col++){ 
      var data = dataFunction(); // yes, it's a function 
             // we need (want) to call it 
      customRow.push(data); 
     } 
     customGrid.push(customRow); 
    } 
    return customGrid; 
} 

var myGrid = newGrid(3,3,buildNewObj); // no parenthesis, no invocation 
+0

真棒。這工作。謝謝 – ZAR

相關問題