Как создать 2 одинаковых независимых объекта в JavaScript?

Столкнулся со следующей проблемой - создаю 2 объекта. Меняю свойства в одном объекте - меняются они же в другом. Как их сделать самостоятельными, даже если основываются на одном и том же наборе исходных данных?

function Item(coordinates){
    this.coordinates = coordinates || false;

    this.moveItemToAValueBelow = function(value){
        for (var i in this.coordinates){
            this.coordinates[i][1]+=value;
        }
    }
}

var first = new Item(data);
var second = new Item(data);
second.moveItemToAValueBelow(20);

console.log(first.coordinates);
console.log(second.coordinates);


console.log показывает одно и тоже. Как правильно создавать 2 разных объекта с одинаковыми данными?

Полный код странички представлен здесь https://github.com/valenso/pattern
  • Вопрос задан
  • 4134 просмотра
Решения вопроса 2
AMar4enko
@AMar4enko
Вам надо было начать с того, что за данные у вас. Я посмотрел на github - у вас вложенные массивы.
В этом случае вариант @ghaiklor не сработает, потому что он только для плоских объектов.
data.slice(0) тоже не проканает, потому что уникальным будет только первый уровень массива.
Попробуйте JSON.parse(JSON.stringify(data))
Ответ написан
mlnkv
@mlnkv
JavaScript Developer
function cloneArray(array){
    var result = [];
    for (var i in array) {
        if (array[i] === undefined) continue;
        result[i] = array[i].length ? cloneArray(array[i]) : array[i];
    }
    return result;
}

var data = [[10,10], [0,30], [20,30], [10,10]];

var array1 = cloneArray(data);
var array2 = cloneArray(data);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
У вас объекты независимые, но вы в конструкторы передаете один и тот же экземпляр данных, т.е. у вас coordinates один на два объекта.
В JavaScript нет стандартного метода для осуществления "глубокого клонирования".
Если используете jQuery, то можете попробовать this.coordinates = $.extend({},coordinates).
Ответ написан
ghaiklor
@ghaiklor
NodeJS TechLead
Или же на чистом JS написать свой clone()
function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

this.coordinates = clone(coordinates);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы