Копирование объектов в JavaScript

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

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.