2014-03-04 48 views
0

下面是我所擁有的:粒子是一個充滿粒子對象的數組。目前我只是將對象的引用添加到數組中,所以在循環結束後,每個對象都具有相同的速度值。但我想爲每一個不同。 需要做什麼,數組中有實際的對象,而不僅僅是對象的引用?陣列中的對象,複製不參考

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

是'this.model'什麼? – zerkms

+0

你可以顯示vec3代碼嗎? – BenM

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

構造函數絕對聽起來像是需求。 – Xotic750