综合对象深复制

对象深复制

要复制的数据:

var d = Symbol();
var e = Symbol();
var ss = { a: 1 };
var date = new Date();
date.setFullYear(2022);
var obj = {
	a: 1,
	b: 2,
    c: [1, 2, 3],
    zz: new Set([1, 2, ss]),
    yy: new Map(),
    [d]: "aaa",
    z: document.createElement("div"),
    d: {
    	e: date,
        f: /a/g,
        g: function (s) {
        	console.log(s);
        },
        h: {},
    },
};
Object.defineProperties(obj.d.h, {
	i: {
    	value: 10,
    },
    j: {
    	configurable: true,
        writable: true,
        value: [1, 2, 3, 4],
    },
    k: {
    	writable: true,
        value: {
        	l: {},
            m: "abcde",
            n: true,
            o: [1, 2, 3],
        },
    },
    [e]: {
    	value: ["a", "b", "c", "e"],
    },
);
obj.z.style.width = "50px";
obj.z.style.height = "50px";
obj.z.style.backgroundColor = "red";

Object.defineProperties(obj.d.h.k.l, {
	p: {
		value: function () {
        console.log("p");
    	},
	},
    q: {
    	value: {
        	r: { a: 1 },
            j: { b: 2 },
        },
    },
});
var a_1 = { a: 1 };
var a_2 = { b: 2 };
obj.yy.set("name", "xietian");
obj.yy.set(a_1, a_2);

Object.defineProperty(obj, "www", {
	set: function (_v) {
		this.a = _v;
	},
    get: function () {
    	return this.a;
    },
});

深复制:

function cloneObject(source,target){
	if(!target) target={};
    var names=Object.getOwnPropertyNames(source).concat(Object.getOwnPropertySymbols(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 o;
            if(desc.value instanceof HTMLElement){
            	o=document.createElement(desc.value.nodeName);
                Object.keys(desc.value.style).forEach(key=>o.style[key]=desc.value.style[key]);
            }else if(desc.value.constructor===Set || desc.value.constructor===Map || desc.value.constructor===Date){
            	o=new desc.value.constructor(desc.value);
            }else if(desc.value.constructor===RegExp){
            	o=new RegExp(desc.value.source,desc.value.flags);
            }else{
            	o=new desc.value.constructor();
            }
            Object.defineProperty(target,names[i],{
            	enumerable:desc.enumerable,
                configurable:desc.configurable,
                writable:desc.writable,
                value:o
            });
            cloneObject(desc.value,o);
            }else{
            	Object.defineProperty(target,names[i],desc);
            }
		}
	return target;
}

数据修改:

var o=cloneObject(obj);
obj.d.h.k.o[1]=100;
console.log(obj,o);
document.body.appendChild(o.z);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值