【问题标题】:Javascript: Passing constructor as parameter, function instantiates only a single objectJavascript:将构造函数作为参数传递,函数仅实例化一个对象
【发布时间】:2014-02-14 13:26:48
【问题描述】:

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

现在,我有:

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

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

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

谢谢!

【问题讨论】:

    标签: javascript oop object constructor


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      相关资源
      最近更新 更多