15

在页面加载时,我正在创建两个 Javascript 对象,objDemo1objDemo1Backup后者只是第一个的精确副本。

例如

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已经改变了。
  • 我的代码肯定会达到“重置”功能,我已经尝试过objDemo1 = objDemo1Backup......我只是无法弄清楚替换对象的语法。
4

3 回答 3

11

我正在使用angularjs,我花了一些时间来了解如何将一个对象复制到另一个对象。通常,您将通过调用clone或在 angular copy中获得对象克隆:

var targetObj = angular.copy(sourceObj);

这为您提供了源对象的新克隆实例(带有新引用)。但是快速浏览一下文档会发现copy的第二个参数:

angular.copy(sourceObj, targetObj)

这样,您可以使用源的字段和方法覆盖目标对象,保持目标对象的引用。

于 2014-10-24T16:17:05.897 回答
7

在 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
于 2012-12-18T16:47:43.083 回答
2

您可以使用Object.assign.

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

它占用两个参数:targetsource。当函数完成时,对象的所有内部target都将附加source一个。

于 2019-06-22T19:26:51.863 回答