深拷贝与浅拷贝

3 篇文章 0 订阅

在做web地图符号化的开发时候,有这么一个需求:选择一个地图符号,进入编辑界面,当编辑取消时,需要回复原来的地图符号。也就是说需要用一个变量来存储刚进入编辑界面的符号对象,在取消编辑符号的时候,将该符号对象重新拿出来给编辑的符号做还原。

最开始,我的写法是这样的:

var initSymbol={
  size:10px;
  color:{r:10,g:104,b:44};
}//原始符号

var tempSymbol=initSymbol;//记录未编辑的原始符号

initSymbol.size=14px;
initSymbol.color.r=100;//操作符号

initSymbol=tempSymbol//还原符号

结果是还原失败了,因为tempSymbol和initSymbol其实所指向的是同一个对象,所以对initSymbol进行操作编辑的同时,tempSymbol也发生相应的改变,所以原始符号并没有被存储下来。“tempSymbol=initSymbol”这里的拷贝就是浅拷贝。考虑到jquery有提供深拷贝的机制(重新构建一个对象,并将变量指向新对象)。

以下是我另一次尝试:

var initSymbol={
  size:10px;
  color:{r:10,g:104,b:44};
}//原始符号

var tempSymbol=$.extend{true,{},initSymbol};//记录未编辑的原始符号

initSymbol.size=14px;
initSymbol.color.r=100;//操作符号

initSymbol=tempSymbol//还原符号

这次由于是深层拷贝,所以完成了对符号的缓存,达到了目标。jquery的$.extend()方法可以完成深拷贝和浅拷贝,深拷贝必须将第一个参数设为true。

如果改变的符号的属性都是对象的形式,则还有另一种方式实现:

var initSymbol={
  position:{left:10,top:10}
  color:{r:10,g:104,b:44};
}//原始符号

var tempSymbol=initSymbol;//记录未编辑的原始符号

var newPosition={left:-10,top:-10};
var newColor={r:14,g:33,b:69};
initSymbol.color=newPosition;//操作符号
initSymbol.color=newColor;//操作符号

initSymbol=tempSymbol//还原符号

这里用新的对象给符号的元素对象赋值,改变了符号,却也依旧不会影响到tempSymbol的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值