Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   динамическое обновление свойств объекта в цикле (https://javascript.ru/forum/misc/43395-dinamicheskoe-obnovlenie-svojjstv-obekta-v-cikle.html)

grego 03.12.2013 23:04

динамическое обновление свойств объекта в цикле
 
всем привет!

Вообщем столкнулся с одной проблемой, которую в принципе могу обойти обходным путем, но мне интересна причина такого поведения.

Вообщем, есть код:
var i = 0,
        length = 10,
        relation = {
            startPoint: {
                x:0,
                y:0
            },
            endPoint: {
                x:0,
                y:0
            }
        },
        relations = [];

        for(; i< length; i++) {
            relation.startPoint.x = i;
            relation.startPoint.y = i;
            relation.endPoint.x = i;
            relation.endPoint.y = i;
            relations.push(relation);
        }

        console.log(relations);


Суть кода заключается в динамическом изменении свойств объекта, после чего текущий объект заносится в массив. Ожидается, что на выходе получается массив из объектов, в котором для свойств будут заданы значения от нуля до 9 для каждого последующего объекта соответственно.
Но, в реальности получается так, что на выходе получается массив, в котором у каждого объекта значение свойств = 9.
Почему так происходит - я не понимаю, вроде бы переопределение свойств должно происходить в рантайме.
Вопрос - подскажите пожалуйста, по какой причине значения свойств не присваиваются динамически?
заранее благодарю :)

danik.js 04.12.2013 00:15

Цитата:

Сообщение от grego
Ожидается, что на выходе получается массив из объектов,

А в итоге у тебя получается массив из 10 ссылок на один и тот же объект.
У тебя ведь объект relation один? Один!
Создавай на каждой итерации новый объект. Например так:


var i = 0,
        length = 10,
        relations = [];
 
        for(; i< length; i++) {
            relations.push({
                startPoint: {
                    x:i,
                    y:i
                },
                endPoint: {
                    x:i,
                    y:i
                }
            });
        }
 
        console.log(relations);



Или напиши функцию clone() (или copy()), которая будет создавать копию объекта.

Можешь еще так сделать (в традиционном стиле для ооп):

function Relation(startX, startY, endX, endY) {
    this.startPoint = {
        x: startX,
        y: startY
    };
    this.endPoint = {
        x: endX,
        y: endY
    };
}

var i = 0,
    length = 10,
    relations = [];

for(; i< length; i++) {
    relations.push(new Relation(i, i, i, i));
}

console.log(relations);

рони 04.12.2013 07:17

grego,
в начало строки 3 добавить var и перенести в конец 15ой

grego 04.12.2013 23:29

Ребята, спасибо! Оба ответа подошли под решение!)


Часовой пояс GMT +3, время: 04:41.