Creating a new object, not a reference
本问题已经有最佳答案,请猛点这里访问。
这是我第一次来这里。
所以问题是,我有一个对象,我的所有变量都是这样的:
1 2 3 4 5 | app.Variables = { var1: 0, var2: 0, var3: 0 } |
我想把这些值存储在一个名为defaults的对象中,如下所示:
1 | app.Defaults = app.Variables |
但现在的问题是,在我的代码中,app.variables.var1,例如,按如下方式递增:
1 | app.Variables.var1++ |
这意味着app.defaults.var1的增量也等于app.variables.var1。
我在这里该怎么办?
最简单的版本是使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* simplest */ var clone = JSON.parse(JSON.stringify(obj)); /* fastest */ function clone(obj) { if (obj == null ||typeof obj !="object") return obj; var copy = obj.constructor(); for (var attr in obj) { if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; } return copy; } var clone2 = clone(obj); |
您可以编写一个DeepClone方法,将对象的每个属性的每个值复制到一个新的属性。
注意,我扩展了object.prototype以避免类型检查,而且为了简单起见,如果您觉得不喜欢它,可以更改它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | Object.defineProperty(Object.prototype,"clone", { enumerable : false, value: function(deep) { deep |= 0; var type = typeof this; if (type !=="object") { return this.valueOf(); } var clone = {}; if (0 === deep) { for (var prop in this) { clone[prop] = this[prop]; } } else { for (var prop in this) { if ( typeof this[prop] !=="undefined" && this[prop] !== null) clone[prop] = ( typeof this[prop] !=="object" ? this[prop] : this[prop].clone(deep - 1)); else clone[prop] =""; } } return clone; } }); Object.defineProperty(Array.prototype,"clone", { enumerable : false, value:function(deep) { deep |= 0; var clone = []; if (0 === deep) clone = this.concat(); else this.forEach(function(e) { if ( typeof e !=="undefined" && e !== null) clone.push(( typeof e !=="object" ? e : e.clone(deep - 1))); else clone.push(""); }); return clone; } }); |
示例输出和演示
1 2 3 4 5 6 7 8 | var first = { var1:0, var2:0 var3:0 }; var second = first.clone(Infinity); first.var1++; console.log (first.var1,second.var1,second); //1 , 0 |
要将此应用于代码,您只需克隆对象
第一个论点是深度的层次。如果省略,则只克隆第一个级别,这在本例中就足够了。