Javascript:将构造函数作为参数传递,函数仅实例化单个对象

时间:2014-01-23 19:31:29

标签: javascript oop object constructor

我想要一个特定的功能来创建一个网格并在每个插槽中插入一个唯一的对象。这里的关键是,函数应该接受构造函数作为参数(因为可能有多个构造函数可能需要通过此函数调用),但实例化多个对象。

现在,我有:

//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;

然后网格中的每个插槽都有自己唯一的对象。

如何在仍然通过参数传递构造函数的同时在网格的每个槽中获取唯一对象?

谢谢!

1 个答案:

答案 0 :(得分:1)

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