Заменить один объект javascript другим объектом

На загрузке страницы я создаю два объекта Javascript, objDemo1 и objDemo1Backup, где последний является просто точной копией первого.

например.

objDemo1 { 
    sub_1 = { something: 123, somethingElse: 321 },
    sub_2 = { something: 456, somethingElse: 654 }
}

Я могу изменить значения в sub_, а также добавить/удалить новый sub_, но единственным объектом, который я редактирую, является objDemo1. т.е. я никогда не изменяю objDemo1Backup

У меня есть кнопка reset, которая при нажатии reset objDemo1 вернется к тому, что было, когда первоначально загружалась страница (т.е. objDemo1 = objDemo1Backup). Именно здесь у меня возникла проблема.

Как установить objDemo1 в objDemo1Backup?

Я пробовал:

objDemo1 = objDemo1Backup;

и

objDemo1 = null;
var objDemo1 = objDemo1Backup;

... а также аналогичные варианты, но ничего не работает. Любые идеи?

  • Примечание. Я могу подтвердить, что в момент сброса значение objDemo1Backup точно такое же, как и при его создании, и objDemo1 изменилось.
  • Мой код определенно поражает функциональность "reset", где я пробовал objDemo1 = objDemo1Backup... Я просто не могу понять синтаксис для замены объекта.

Ответ 1

В JavaScript объекты передаются по ссылке, а не по значению. Итак:

var objDemo, objDemoBackup;
objDemo = {
    sub_1: "foo";
};
objDemoBackup = objDemo;
objDemo.sub_2 = "bar";
console.log(objDemoBackup.sub_2);   // "bar"

Чтобы получить копию, вы должны использовать функцию копирования. JavaScript не имеет одного изначально, но вот реализация clone: Как правильно клонировать объект JavaScript?

var objDemo, objDemoBackup;
objDemo = {
    sub_1: "foo";
};
objDemoBackup = clone(objDemo);
objDemo.sub_2 = "bar";
console.log(objDemoBackup.sub_2);   // undefined

Ответ 2

Я использую angularjs, и мне потребовалось некоторое время, чтобы узнать, как скопировать объект на другой объект. Обычно вы получаете клонирование объектов, вызывая клон или здесь, в angular copy:

var targetObj = angular.copy(sourceObj);

Это дает вам новый клонированный экземпляр (с новой ссылкой) исходного объекта. Но быстрый просмотр документов открывает второй параметр копии:

angular.copy(sourceObj, targetObj)

Таким образом вы можете переопределить целевой объект с полями и методами источника и, также сохранить ссылку на целевые объекты.

Ответ 3

Вы можете использовать Object.assign.

ObjectConstructor.assign(target: T, source: U): T & U

Он принимает два параметра: target и source. Когда функция завершится, все внутренние объекты target объекта будут заменены на source.