数组中的对象,不是引用的副本

时间:2014-03-04 10:02:35

标签: javascript

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

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);
}

1 个答案:

答案 0 :(得分:2)

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

var particle = this.model;

不会复制 this.model,它只是使用一个新变量来引用它。然后每次你做

particle.velocity = vec3.create();

...你覆盖 particle.velocity上的上一个循环的值,这也是this.model.velocity,因为particle === this.model

听起来你想复制 this.model,而不是重复使用它。你如何做到这一点将取决于this.model。这是一种天真的方式:

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

然后

var particle = shallowCopy(this.model);

......但是,这又取决于this.model是什么。如果this.model具有引用其他对象的属性,则上面重用这些对象;你需要一个“深层”克隆功能来复制这些功能。

你真正想要的,而不是克隆,是一个构造函数

function Model() {
    // Set up basic properties and such on `this`, e.g.
    this.foo = "bar";
}

然后

var particle = new Model();