对象的深拷贝
//提示:
//对象属性们 Object.keys(obj1)返回数组装的obj1的所有成员名
//var obj={name:"jack"},a="name";obj[a]可以取到"jack"
Object.prototype.copy1=function () {
//设计代码 让它有如下功能
}
var obj={name:"karen",infos:[{img:"xx",count:20}]}
var obj2=obj.copy1()
obj2.infos[0].count=30
console.log(obj.infos[0].count)//30var obj3=obj.copy1(true)
obj3.infos[0].count=40
console.log(obj.infos[0].count)//30
console.log(obj3.infos[0].count)//40
//方法1. 最简单的方式,缺陷是原型链没有拷贝 函数和null不会拷贝‘‘
var copy1 = function (obj) {
return JSON.parse(JSON.stringify(obj));
}
var a = {a:function(){console.log('hello world')},b:{c:1},c:[1,2,3],d:"wanger",e:new Date(),f:null,g:undefined}
var b = copy1(a)
’
//方法2.利用自调
var copy1 = function (obj) {
if(obj === null) return null
if(typeof obj !== 'object') return obj;
if(obj.constructor===Date) return new Date(obj);
if(obj.constructor === RegExp) return new RegExp(obj);
var newObj = new obj.constructor (); //保持继承链
for (var key in obj) {
if (obj.hasOwnProperty(key)) { //不遍历其原型链上的属性
var val = obj[key];
newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
}
}
return newObj;
};
用