Заменить один объект 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
.