2020-08-13

js复杂对象obj的深复制


```**

## javascript

**
//obj是一个复杂的对象,用来被复制的对象;
var obj={
            a:1,
            b:2,
            c:[1,2,3],
            z:document.createElement("div"),
            d:{
                e:new Date(),
                f:/a/g,
                g:function(s){
                    console.log(s);
                },
                h:{

                }
            }
        }
        Object.defineProperties(obj.d.h,{
            i:{
                value:10
            },
            j:{
                configurable:true,
                value:[1,2,3,4]
            },
            k:{
                writable:true,
                value:{
                    l:{},
                    m:"abcde",
                    n:true,
                    o:[1,2,3]
                }
            }
        })

        Object.defineProperties(obj.d.h.k.l,{
            p:{
                value:function(){
                    console.log("p")
                }
            },
            q:{
                value:{
                    r:{a:1},
                    j:{b:2}
                }
            }
        });
      

        console.log(obj);
        
        function cloneObj(source,target){
            if(target===undefined) target={};
            var names=Object.getOwnPropertyNames(source);
            for(var i=0;i<names.length;i++){
                var desc=Object.getOwnPropertyDescriptor(source,names[i]);
                if(typeof desc.value==="object" && desc.value!==null){
                    var obj;
                   switch(true){
                       case desc.value.constructor===Date:
                       obj=new Date(desc.value.toString());
                       break;
                       case desc.value.constructor===RegExp:
                       obj=new RegExp(desc.value.source,desc.value.flags);
                       break;
                       case HTMLElement.isPrototypeOf(desc.value.constructor):
                       obj=document.createElement(desc.value.nodeName);
                       break;
                       default:
                       obj=new desc.value.constructor()
                   }
                    Object.defineProperty(target,names[i],{
                        enumerable:desc.enumerable,
                        writable:desc.writable,
                        configurable:desc.configurable,
                        value:obj
                    });
                    cloneObj(desc.value,obj);
                }else{
                    Object.defineProperty(target,names[i],desc)
                } 
            }
            return target;
        }

        var o={a:1};
        o=cloneObj(obj);
        obj.d.h.j[1]=100;
        console.log(o);
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值