Копирование объектов в JavaScript
159
посл. ред.
24.06.2016
При создании объекта в переменную помещается не сам объект, а ссылка для работы с ним. Поэтому при попытке скопировать объект в другую переменную скопируется только ссылка на него, а сам объект будет общим.
var car = {color: 'red'}; /* создан объект car */ var new_car = car; /* попытка скопировать объект в переменную new_car */ delete new_car.color; /* правка объекта new_car */ alert(car.color); /* undefined, изменение коснулось объекта car */
Чтобы действительно скопировать объект (клонировать), нужно создать пустой объект и скопировать в него все свойства из исходного объекта. При этом, если свойство в свою очередь является объектом, то его копирование тоже необходимо производить по отдельным свойствам.
function cloneObject(obj) { var newObj = {}; for (var prop in obj) { if (typeof obj[prop] == 'object') { newObj[prop] = cloneObject(obj[prop]); } else { newObj[prop] = obj[prop]; } } return newObj; } var address = { street: '5-я Авеню', house: 11, distanceTo: function() { alert('Расчет расстояния...'); }, owners: { first: 'Джон', second: 'Джэк' } }; var loc = cloneObject(address); /* клонирование объекта */ /* Редактирование исходного объекта */ address.house = 123; address.distanceTo = null; address.owners.first = 'Адам'; /* Проверка объекта-клона */ alert(loc.house); /* 11 */ loc.distanceTo(); /* метод работает */ alert(loc.owners.first); /* Джон */
Простая рекурсивная функция cloneObject() возвращает ссылку на новый объект. Как видно из примера, изменение свойств в исходном объекте address после клонирования никак не влияет на новый объект loc.