var obj = {
a: 1,
b: "aaa",
c: false,
d: {
e: [3, 4, 6, 8, 9],
f: null,
g: [
{ id: 1, name: "abc", price: 100, tag: ["自营", "特价"] },
{ id: 2, name: "def", price: 200, tag: ["自营"] },
{ id: 3, name: "ghi", price: 300, tag: ["自营", "特价", "双十一"] },
{ id: 4, name: "gkl", price: 400, tag: ["专柜", "双十一"] },
],
h: {
i: /^(?=\D+\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,16}$/i,
j: new Date(),
k: {},
},
},
};
Object.defineProperties(obj.d.h.k, {
l: {
value: [
[1, 2, 3, 4],
[1, 4, 3, 4],
[1, 6, 3, 4],
],
},
m: {
enumerable: true,
value: document.createElement("div"),
},
n: {
writable: true,
value: {
o: [1, 2, 3],
},
},
});
function cloneObj(source, target) {
if (!target) target = new source.constructor();
let name = Object.getOwnPropertyNames(source);
for (let i = 0; i < name.length; i++) {
let desc = Object.getOwnPropertyDescriptor(source, name[i]);
if (typeof desc.value !== "object" || desc.value === null) {
Object.defineProperty(target, name[i], desc);
} else {
let t = {};
switch (desc.value.constructor) {
case Array:
t = [];
break;
case RegExp:
t = new RegExp(desc.value.source, desc.value.flags);
break;
case Date:
t = new Date(desc.value);
break;
default:
if (desc.value instanceof HTMLElement) {
t = document.createElement(desc.value.nodeName);
}
break;
}
Object.defineProperty(target, name[i], {
...desc,
value: t,
});
cloneObj(desc.value, t);
}
}
return target;
}
const o = cloneObj(obj);
console.log("o", o);
手写一个深复制
最新推荐文章于 2024-07-19 20:27:38 发布