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