首先,我并不是说将一个对象深深地克隆到另一个对象。
我有一个对象:
var data1 = {
p1: values1,
p2: values2,
.....
};
value1和value2可以是任何数据类型,如对象或数组。
我有另一个对象:
var data2 = {
p3: values3,
p4: values4,
.....
};
value3和value4可以是任何数据类型,如对象或数组。
现在我想将所有data2的属性克隆到data1。
我想要这个的原因是data1被引用,在data1的属性被更改后我不想破坏引用。
如果我做的话
data1 = clone(data2)
我将打破参考。
更新: 打破引用意味着什么:
var data1 = {
p1: value1
};
var data2 = {
p2: vale2
};
var ref = data1;
如果我这样做:
data1 = clone(data2);
现在ref仍然指向旧的data1,它的值仍然是:
{
p1: value1
}
但我希望ref为data2
答案 0 :(得分:4)
您可以使用此功能:
function replaceProperties(dest, src) {
for (var i in dest)
delete dest[i];
for (var i in src)
dest[i] = src[i];
}
代码很明显,看起来就像你想要的那样。它没有打破参考"就像你说的那样。
虽然在属性不可枚举时或原型中可能无法执行您想要的操作...
如果您不必支持IE10,之前使用__proto__
或setPrototypeof
,则可以在dest
属性更改时进行src
更新:
function replaceProperties(dest, src) {
for (var i in dest)
delete dest[i];
Object.setPrototypeOf(dest, src);
}
答案 1 :(得分:1)
尝试:
Object.extend(data1,data2);
答案 2 :(得分:-2)
使用jQuery.extend()
表示深层副本:var object = $.extend({}, object1, object2);
更多信息http://api.jquery.com/jQuery.extend/#jQuery-extend-target-object1-objectN