Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用对象副本(Javascript)创建数组_Javascript_Arrays_Object_Copy_Fill - Fatal编程技术网

使用对象副本(Javascript)创建数组

使用对象副本(Javascript)创建数组,javascript,arrays,object,copy,fill,Javascript,Arrays,Object,Copy,Fill,我试图编写一个“通用”数组填充程序,用给定对象填充数组。我用javascript模拟了一个类,现在我想编写一个函数,用该类的类型填充数组 function fillArray(theArrayToFill,amount,theObject) { for ( var i = 0; i != amount; ++i ) {theArrayToFill.push(theObject);} } 但是fillArray(theArray,3,新敌人(0,0));用对象“敌人”的引用填充数组,这

我试图编写一个“通用”数组填充程序,用给定对象填充数组。我用javascript模拟了一个类,现在我想编写一个函数,用该类的类型填充数组

function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i ) 
    {theArrayToFill.push(theObject);}
}
但是fillArray(theArray,3,新敌人(0,0));用对象“敌人”的引用填充数组,这不是我想要的,我想要一个精确的副本,但是当我改变对象0时,对象2可能不会改变

请帮忙
谢谢

我建议您向对象添加克隆方法。clone方法应该创建一个新对象,并通过复制当前对象来设置它的值,然后该方法返回这个新对象

例如:

function clone(obj)
{
    var newObj = new YourObject();
    newObj.setName(obj.getName());
    //Do this for every properties

    return newObj;
}

如果您使用的是下划线,则它提供克隆帮助器函数

function fillArray(theArrayToFill,amount,theObject) {
for ( var i = 0; i != amount; ++i ) 
    {theArrayToFill.push(_.clone(theObject));}
}

既然您已经有了构造函数,下面是如何使用它:

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方法。然后,该方法用指向该对象的引用填充数组,因此数组中的每个项实际上都指向同一个对象

编辑: 如果要将不同的参数传递给构造函数,则不会想到简单的解决方案。以下是一个可能就您的目的而言已经足够的骇客:

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个参数的构造函数,并且基于构造函数中使用的参数的一些检查也将失败,但它完成了任务

附言:我不建议你使用这种方法。看起来克隆方法更适合您的目的。

您可以使用

或者,如果要返回新的数组填充默认值,可以使用下一个代码

function fillArray(amount,theObject) {
    return Array.apply(null,Array(amount)).map(function(_){return Object.create(theObject);});
}

克隆是否保留了原型链?我正在使用jQuery,但代码不起作用。我还需要像这样调用函数:fillArray(数组,3,新敌人(0,0))?我得到错误“uncaughtreferenceerror:uu未定义”@user2815780:
。clone
是一个underline.js方法。我糟糕的jquery克隆只用于DOM元素。但是如果我现在想使用这个填充来制作一个在其构造函数中具有不同参数的化身,那么我需要做什么呢?呵呵,我想我会坚持使用js下划线,但还是要感谢你的帮助:)我认为这对于我的小程序来说有点过分了。但还是个好主意;)
function fillArray(amount,theObject) {
    return Array.apply(null,Array(amount)).map(function(_){return Object.create(theObject);});
}