Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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 - Fatal编程技术网

Javascript 数组中的对象,复制而不是引用

Javascript 数组中的对象,复制而不是引用,javascript,Javascript,这里是我所拥有的:粒子是一个充满粒子对象的数组。目前,我只是将对象的引用添加到数组中,因此在循环结束后,每个对象都具有相同的速度值。但我希望每个人都不一样。 需要做什么,数组中有实际的对象,而不仅仅是对对象的引用 for (i = 0; count > i; i++){ var particle = this.model; //object i want to have multiple clonse from particle.velocity = vec3.create

这里是我所拥有的:粒子是一个充满粒子对象的数组。目前,我只是将对象的引用添加到数组中,因此在循环结束后,每个对象都具有相同的速度值。但我希望每个人都不一样。 需要做什么,数组中有实际的对象,而不仅仅是对对象的引用

for (i = 0; count > i; i++){
    var particle = this.model; //object i want to have multiple clonse from
    particle.velocity = vec3.create(); //vec3.create from glmatrix library
    var x = Math.random() * (0.1 - (-0.1)) + (-0.1); //value -0.1-->0.1
    var y = Math.random() * 0.1; //value 0-->0.1
    var z = Math.random() * (0.1 - (-0.1)) + (-0.1); //value -0.1-->0.1
    vec3.set(particle.velocity, x, y, z);
    this.particles.push(particle);
}

目前,您只有一个重复放入数组的对象:
this.model
。这一行:

var particle = this.model;
不复制此.model,它只使用一个新变量来引用它。那么每次你这么做

particle.velocity = vec3.create();
…覆盖上一个循环在
particle.velocity
上的值,该值也是
this.model.velocity
,因为
particle==this.model

听起来您想复制
此.model
,而不是重用它。如何做到这一点在很大程度上取决于
这个.model
。以下是一种天真的方式:

function shallowCopy(source) {
    var key, dest = {};
    for (key in source) {
        dest[key] = source[key];
    }
    return dest;
}
然后

…但是,这在很大程度上取决于这个.model是什么。如果
this.model
具有引用其他对象的属性,则上述方法将重用这些对象;你需要一个“深度”克隆功能来复制这些

您真正想要的可能不是克隆,而是构造函数:

然后


这个模型是什么?你能显示vec3代码吗?你需要复制对象。你可以寻找“深度克隆”,或者简单地实现一个特定的克隆。在每个迭代上创建一个新的粒子构造函数听起来肯定是需要的。
var particle = shallowCopy(this.model);
function Model() {
    // Set up basic properties and such on `this`, e.g.
    this.foo = "bar";
}
var particle = new Model();