面向对象--(对象的浅克隆和深克隆)

1.什么是浅克隆?

只克隆对象的“表层”,如果对象的某一个属性是引用类型,则不进一步克隆它们,只是传递它们的引用。代码案例如下:

var obj1={
    a:1,
    b:2,
    c:[11,22,33]
}

var obj2={}

for(var k in obj1){
    //k是属性名,obj1[k]是对应的属性值
    obj2[k]=obj1[k]
}


obj1.a++;
console.log(obj1)  //{a:2.b:2}
console.log(obj2)  //{a:1.b:2}

//如果对象里面有引用类型的属性时,则不会克隆
obj1.c.push(44)
console.log(obj1)  //{a:2.b:2,c:[11,22,33,44]}
console.log(obj2)  //{a:1.b:2,c:[11,22,33,44]}

可以使用for...in循环来实现对象的浅克隆。

 

2.什么是深克隆?

克隆对象的全貌,不论对象里面的属性是否是引用类型,都能将它们实现克隆。代码案例如下:

        var sobj1 = {
				a: 1,
				b: 2,
				c: [33, 44, {
					m: 55,
					n: 66,
					p: [77, 88]
				}]
			}

			function deepClone(o) {
				//要判断o是对象还是数组
				if(Array.isArray(o)) {
					//数组
					var result = []
					for(var i = 0; i < o.length; i++) {
						result.push(deepClone(o[i]))
					}
				} else if(typeof o == 'object') {
					//对象
					var result = {}
					for(var k in o) {
						result[k] = deepClone(o[k])
					}
				} else {
					//基本类型值
					var result = o
				}
				return result;
			}

			var sobj2 = deepClone(sobj1)
			console.log(sobj2)    //{a:1,b:2,c:[33,44,{m:55,n:66,p:[77,88]}]}
			
			console.log(sobj1==sobj2)  //false  因为它们是内存中不同的对象
			
			sobj1.c.push(99)
			console.log(sobj1) //{a:1,b:2,c:[33,44,{m:55,n:66,p:[77,88]},99]}
			console.log(sobj2) //{a:1,b:2,c:[33,44,{m:55,n:66,p:[77,88]}]} ,因为没有存在藕断丝连

 

克隆是指克隆一个新的独立的东西出来,在原基础上修改东西并不会影响克隆出来的东西。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值