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

Если ты работаешь с JavaScript, то наверняка сталкивались с задачей копирования объекта. В JavaScript при присваивании объекта переменной в переменную передается ссылка на объект, но не сам объект. Готовой функции в языке для копирования объекта нет. Но если данный функционал необходим, то можно написать собственную функцию копирования объекта.

Самый простой вариант, который я встречал выглядит так:

// ВАРИАНТ 1
// сначала мы преобразуем объект с JSON
// после преобразуем полученный JSON в объект
var cloneOfA = JSON.parse(JSON.stringify(a));

Есть более продвинутая реализация:

ВАРИАНТ 2
// obj — копируемый объект
// copyProto — будет ли скопирован прототип объекта
// copyNested — будут ли клонированы объекты, вложенные в текущий или сохранятся в виде ссылок
// в глобальный объект добавляем свойство
// определяем функцию clone^
Object.clone = function clone(obj, copyProto, copyNested) {
    // создаем функцию-конструктор
function Create() {
        // перебираем элементы объекта
for(var item in obj) {
            // если у объекта есть свойство, то копируем его
if(obj.hasOwnProperty(item)) {
                // через рекурсию копируем вложенные свойства
this[item] = (copyNested && typeof obj[item] == “object”) ? clone(obj[item], true, true) : obj[item];
}
}
    // если необходимо, то копируем прототип
if(copyProto && “__proto__” in obj) {
Create.prototype = obj.__proto__; // IE затупит
}

// создаем и возвращаем экземпляр конструктора
return new Create();
}

Пример использования:

var target = {
“A” : {
“Z” : 1,
“X” : 2,
“Y” : {
“F” : 3,
“G” : 4
}
}
};
target.__proto__.f = function(){};
var clone1 = Object.clone(target, false, true);
clone1.f //undefined
clone1.A == target.A //false
var clone2 = Object.clone(target, true);
clone2.f //function
clone2.A == target.A //true

Ты можешь выбрать любой удобный вариант в зависимости от задачи.