超级大牛逼的深克隆方法

来自超级大牛逼大佬:https://www.cnblogs.com/tangjiao/p/9313829.html

我们都知道对象浅克隆用Object.assign

深克隆用JSON.parse(JSON.stringify());

但是以上的深克隆方法有一个弊端,就是会去掉对象的function属性,以及undefined属性,还会丢失继承关系,Date,正则等

下面是超级大牛逼的深克隆方法:

function deepClone(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;//递归
        }
    }
    return newObj;
}
// 验证
let o = {
    fun:function(){
        console.log(1111)
    },
    name:"哈哈",
    obj:{
        a:{
            b:1
        }
    },
    arr:[
        {
            c:{
                d:2
            }
        }
    ]
}
let cloneO = deepClone(o);
cloneO.fun = "clonefun";
cloneO.name="clone哈哈";
cloneO.obj.a.b="clone1";
cloneO.arr[0].c.d="clone2";
console.log(cloneO);
console.log(o);

let date = new Date();
let cloneDate = deepClone(date);
cloneDate = new Date(new Date().getTime()+1000*60*60);
console.log(date.getTime());
console.log(cloneDate.getTime());

验证后没毛病

posted @ 2021-01-09 22:44  古墩古墩  Views(341)  Comments(0Edit  收藏  举报