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