我正在使用underscore.js库有一个克隆方法。
var newObject = _.clone(oldObject);
我从其中一条评论中读到,它是一个浅层克隆。我想复制一个对象并将其传递给不同的函数。
当我改变function A()
内的newObject时,我得到以下结果......
{
'Des': 'Some Des'
'Des1': 4,
'Des2': {
"ChildDes": 0,
},
},
但是当我将作为克隆对象的newObject传递给另一个function B()
时,我得到的警报值为[Object,Object]
。为什么?我无法打印这样的值..
function B(newObject){
alert(newObject.Des2);
}
答案 0 :(得分:4)
“浅拷贝”是一个副本,只复制所有成员。如果其中一个成员是对象的引用,则复制引用上的更改将影响原始对象。 “深层复制”也会复制对象,因此深度复制元素的更改不会影响原始对象。 深层副本有时很难实现,因为对象成员可以在对象本身上有引用。
使用不同的复制样式玩一点,看看会发生什么。另见:What does it mean to clone() an object?
答案 1 :(得分:0)
“浅拷贝”和“深拷贝”这两个术语并未一致使用,应避免使用恕我直言。我建议将克隆操作分为三类:
派生对象的克隆方法的正常模式应该是从克隆其父对象开始,然后克隆任何包含外部对象引用的字段,这些对象包含要克隆的对象应该保留的内容,哪些不能依赖永远持有那些相同的东西。如果每个派生类都遵循该模式,那么将实现适当的语义级克隆。