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


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

Например

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

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

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

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

Я пробовал:

objDemo1 = objDemo1Backup;

И

objDemo1 = null;
var objDemo1 = objDemo1Backup;

...а также аналогичные вариации, но, похоже, ничего не работает. Есть идеи?

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

2 ответа:

В 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

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

var targetObj = angular.copy(sourceObj);

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

angular.copy(sourceObj, targetObj)

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