我正在尝试编写一个“通用”数组填充器,用给定对象填充数组。我在javascript中编写了一个类,现在我想写一个用该类的类型填充数组的函数
function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i )
{theArrayToFill.push(theObject);}
}
但是fillArray(theArray,3,new Enemy(0,0));使用对象“敌人”的引用填充数组,这不是我想要的,我想要一个精确的副本,但是当我改变对象0时,对象2可能不会改变。
请帮助 感谢
答案 0 :(得分:1)
我建议您为对象添加克隆方法。 clone方法应该创建一个新对象并通过复制当前对象来设置它的值,然后该方法返回这个新对象。
示例:
function clone(obj)
{
var newObj = new YourObject();
newObj.setName(obj.getName());
//Do this for every properties
return newObj;
}
答案 1 :(得分:0)
如果您使用的是Underscore,它会提供克隆辅助功能。
function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i )
{theArrayToFill.push(_.clone(theObject));}
}
答案 2 :(得分:0)
由于您已经拥有构造函数,因此以下是使用它的方法:
function fillArray(theArrayToFill,amount,ctor) {
for ( var i = 0; i != amount; ++i ) {
theArrayToFill.push(new ctor(0,0));
}
}
// usage:
fillArray(theArray,3,Enemy);
最初调用fillArray方法的方法是,创建一个对象(在调用函数之前),并将其作为参数传递给fillArray方法。然后该方法使用对该对象的引用来填充数组,因此数组中的每个项目确实指向同一个对象。
编辑: 如果要将不同的参数传递给构造函数,则不会想到任何简单的解决方案。这是一个可能足以满足您目的的hacky:
function fillArray(theArrayToFill,amount,ctor) {
for ( var i = 0; i != amount; ++i ) {
theArrayToFill.push(new ctor(arguments[3], arguments[4], arguments[5],
arguments[6], arguments[7], arguments[8], arguments[9], arguments[10],
arguments[11], arguments[12], arguments[13], arguments[14]));
}
}
// usage:
fillArray(theArray,3,Enemy,0,0);
fillArray(theArray,3,Friend,1,2,3,4,5,6,7,8);
显然这仅适用于参数少于12的构造函数,并且构造函数中基于已使用参数的某些检查也会失败,但它可以完成工作。
PS:我不建议你使用这种方法。看起来克隆方法更适合您的目的。
答案 3 :(得分:0)
您可以使用Object.create()
function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i ) {
theArrayToFill.push(Object.create(theObject));
}
}
或者如果要返回新数组填充的默认值,可以使用下一个代码
function fillArray(amount,theObject) {
return Array.apply(null,Array(amount)).map(function(_){return Object.create(theObject);});
}