面向对象2之对象深拷贝与浅拷贝

拷贝就是把父对象的属性,全部拷贝给子对象。

1.浅拷贝

浅拷贝就是就是公用一个引用,一个改变会影响另一个

var obj = {

a : 10,

b : 20

};

function copy(obj) {

var newObj = {};

for (var i in obj) {

newObj[i] = obj[i];

}

return newObj;

}

var obj2 = copy(obj);

console.log(obj2.a);//10 成功复制了obj的a

obj2.a  = 111; //更改obj2的a

console.log(obj2.a);//111 改变

console.log(obj.a);//10 不变 obj2的改变不影响obj 说明子元素只是拷贝了父元素的内存地址



2.深拷贝

所谓”深拷贝”,就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用”浅拷贝”就行了。


//需求:打印出一个对象所有的属性值 包括对象中的数组或者对象中的对象属性,不要打印整体

var ls = {

name : "老王",

love : {

name : "web",

size : 10,

list : {

name1 : "html",

name2 : "javascrpt",

name3 : "css"

},

fun : ["ajax","jquery","json"]

}

}

//打印出所有的对象

/*for (var attr in ls) {

console.log(ls[attr]);

//思考:看当前的值是否是对象还是数组

//对象和数组的时候需要再次遍历

}*/

//思路 : 采用递归

function deepTravel(obj) {

for(var attr in obj) {

//需要判断,到底这个值是否是数组,还是普通的字符串/数组

//typeof arr是object,typeof obj还是Object

//采用for in 循环可以遍历数组和对象

//采用递归去深度遍历对象中的对象属性

if(typeof obj[attr] === "object") {

deepTravel(obj[attr]);

} else {

//不是对象,直接打印其值即可

console.log(attr + ":"  + obj[attr]);

}

}

}

deepTravel(ls);//name:老王
       // name:web
       //size:10
       //name1:html
       //name2:javascrpt
      //name3:css
      //0:ajax
                      //1:jquery
      //2:json


//深拷贝2

//对象的深拷贝
//oo原始对象 no新对象
//普通类型 string number 等 a = b
//当原始对象的某个属性是数组时 应该首先在新对象中创建数组
//当原始对象的某个属性是对象时 现在新对象中创建一个对象属性
//deepCopy(lw,{});


//第二个参数可选
function deepCopy2(oo,no) {
var no = no || {};//可以不传第二个参数
for (var i in oo) {
//代表这个原始对象的某一个属性是对象
if (typeof oo[i] === "object") {
//创建新的属性 数组或者对象
no[i] = oo[i].constructor === Array ? [] : {};
//将对象或数组的内容拷贝到新数组
//no[i]第一次是空对象或者空数组
deepCopy2(oo[i],no[i]);
} else {
no[i] = oo[i];//给新对象新增i对应的属性
}
}
return no;//返回新对象
}


console.log(deepCopy2(lw));


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值