class Box {
static ARG = ["a", "b"];
constructor(a, b) {
this.a = a;
this.b = b;
}
play() {
console.log(this.a + this.b);
}
}
var obj = {
a: 1,
b: "a",
c: false,
d: {
e: undefined,
f: null,
g: [1, 2, 3, 4, 5],
h: new Date(),
i: /^[a-z]{2,4}$/gi,
j: new Box(4, 5),
k: {
}
}
}
Object.defineProperties(obj.d.k, {
l: { value: 10 },
m: {
configurable: true,
writable: true,
value: 20
},
n: {
enumerable: true,
value: function () {
console.log("aaaa");
}
},
o: {
value: new Image()
}
})
function cloneObject(target, source) {
var names = Object.getOwnPropertyNames(source);
for (let i = 0; i < names.length; i++) {
var desc = Object.getOwnPropertyDescriptor(source, names[i]);
if (typeof desc.value === "object" && desc.value !== null) {
var obj;
if (desc.value instanceof HTMLElement) {
obj=document.createElement(desc.value.nodeName);
} else {
switch (desc.value.constructor) {
case Box:
obj = new desc.value.constructor(desc.value[Box.ARG[0]], desc.value[Box.ARG[1]]);
break;
case RegExp:
obj = new desc.value.constructor(desc.value.source, desc.value.flags);
break;
default:
obj = new desc.value.constructor();
}
}
cloneObject(obj, desc.value);
Object.defineProperty(target, names[i], {
value: obj,
enumerable: desc.enumerable,
writable: desc.writable,
configurable: desc.configurable
});
} else {
Object.defineProperty(target, names[i], desc);
}
}
return target;
}
var obj1 = cloneObject({}, obj);
obj.d.k.m = 100;
console.log(obj1);