0

我正在为对象元素分配 1-50 之间的随机值,我有 5 个对象,我不知道为什么,但所有对象都获得相同的随机值......

这是我的代码:

var SmileyRed = {
   radius: 15,
   xspeed: 0,
   yspeed: 0,
   xpos:350,  // x-position of smiley
   ypos: 65  // y-position of smiley
};

var SmileyReds = new Array();

 for (var i=0; i<5; i++){
 SmileyReds[i] = SmileyRed;
 SmileyReds[i].xspeed = Math.floor((Math.random()*50)+1);
 SmileyReds[i].yspeed = Math.floor((Math.random()*50)+1);
 }

SmileyReds[0].xspeed 和 SmileyReds[3].xspeed 具有相同的值,但它们不应该不同吗?

4

2 回答 2

3

问题是从 0 到 4 的索引包含对同一对象的引用SmileyRed。如果您想将它们分开,您应该为每次迭代创建一个新对象。

因此,您实际上是在每次迭代中更改同一个对象。因此,您将始终使用最后一个随机数(来自最后一个对象)。

通过调用返回对象的函数,每次迭代都会得到一个新对象。如下所示。

var SmileyRed = function() {
    return {
       radius: 15,
       xspeed: 0,
       yspeed: 0,
       xpos:350,  // x-position of smiley
       ypos: 65  // y-position of smiley
    }
};

var SmileyReds = new Array();

 for (var i=0; i<5; i++){
     SmileyReds[i] = SmileyRed();
     SmileyReds[i].xspeed = Math.floor((Math.random()*50)+1);
     SmileyReds[i].yspeed = Math.floor((Math.random()*50)+1);
 }

JSfiddle

于 2013-11-10T20:12:57.067 回答
3

问题在于,当您使一个对象等于另一个对象时,新对象是原始对象的引用,而不是副本。

发生的事情是您正在为原始的 SmileyRed 创建 5 个参考。本质上,当你改变一个时,你就改变了所有。因此,只有在循环中应用的值来自循环的最后一遍,前 4 遍被覆盖。

您可以更改为:

var SmileyReds = new Array();

 for (var i=0; i<5; i++){
/* new object each pass*/
 SmileyReds[i] =  {
   radius: 15,
   xspeed: 0,
   yspeed: 0,
   xpos:350,  // x-position of smiley
   ypos: 65  // y-position of smiley
};
 SmileyReds[i].xspeed = Math.floor((Math.random()*50)+1);
 SmileyReds[i].yspeed = Math.floor((Math.random()*50)+1);
 }

另一种方法是:

var SmileyRed = function(){
    return{
       radius: 15,
       xspeed: 0,
       yspeed: 0,
       xpos:350,  // x-position of smiley
       ypos: 65  // y-position of smiley
    };
}

 for (var i=0; i<5; i++){
    /* new object each pass*/
     SmileyReds[i] =  SmileyRed();/* note () this time*/
于 2013-11-10T20:13:04.747 回答