2013-11-10 3 views
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 имеют одинаковые значения, но они не должны быть разными?

+0

Ваш массив содержит 5 ссылок на тот же объект. Есть только один SmileyRed. – bfavaretto

+0

@bfavaretto Я просто понял, что оригинальные SmileyRed показывают также одинаковые случайные значения, я думал, что каждый раз делаю копию SmileyRed ... как я могу сделать их разными независимыми объектами? – Anarkie

ответ

3

Проблема заключается в том, что когда вы делаете объект равен другому объекту, новый объект является refrence оригинала, а не копии.

Что происходит, вы создаете 5 ссылок на оригинал SmileyRed. По сути, когда вы меняете один, вы меняете все. Таким образом, только значение, применяемое в вашем цикле, связано с последним проходом цикла, предыдущие 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*/ 
+0

Я вижу, что это создает 5 объектов, нет ли способа скопировать SmileyRed, а затем работать с элементами? Я думаю, что копирование этого объекта было бы проще. – Anarkie

+0

@Anarkie в JavaScript нет встроенного механизма копирования объектов. Вы можете написать функцию, чтобы сделать это, но это довольно сложная проблема в целом. – Pointy

+0

Возможно, используя 'jQuery.extend' http://api.jquery.com/jQuery.extend/ http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an-object – Cristy

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

+1

В этом случае из-за того, как вы написали функцию, вам даже не нужно «новое». – Pointy

Смежные вопросы