浅拷贝:
1.用for循环获取引用对象的属性和值,赋值给新对象:
Object.prototype.num=1;
person1={
name:'张三',
age:12
};
function clone(origin,target){
var tar=target || {};
for(var key in origin){
/*for in循环,原型中自定义的属性也会被循环出来;
* 所以用hasOwnPerperty,判断是否是实例中是属性
*/
if(origin.hasOwnProperty(key)){
tar[key]=origin[key];
};
};
return tar;
};
var person2=clone(person1);
console.log(person1,person2);
深拷贝:
1.还是利用for循环和递归,判断key值是原始值,还是引用值;
function deepClone(origin,target){
var target=target||{},
toStr=Object.prototype.toString,
arrType='[object Array]';
for(var key in origin){
if(origin.hasOwnProperty(key)){
if(typeof(origin[key])==='object'&&origin[key]!==null){
if(toStr.call(origin[key])===arrType){/*判断是对象还是数组*/
target[key]=[];
}else{
target[key]={};
};
/*递归*/
deepClone(origin[key],target[key]);
}else{
target[key]=origin[key];
}
}
};
return target;
};
var obj={
name:'lee',
age:456,
children:{
name:'wang',
age:12,
son:{
name:'gwheo',
age:10
}
},
arr1:[1,2,3]
};
var Obj2=deepClone(obj);
2.利用JSON实现深拷贝,问题是用json拷贝方法的时候,JSON这种方式就不行
var str=JSON.stringify(obj);
var obj3=JSON.parse(str);