Копирование объектов в JavaScript
324
посл. ред.
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.