// 可以用Object.getPrototypeOf(obj)代替obj.__proto__
const clone = (source, target={}) => {
let names = Object.getOwnPropertyNames(source)
for (let i = 0; i < names.length; i++) {
let desc = Object.getOwnPropertyDescriptor(source, names[i])
if (typeof desc.value === 'Object' && desc.value !== null) {
let objs
if (desc.value.constructor === Date) {
objs = new desc.value.constructor(desc.value)
} else if (desc.value.constructor === RegExp) {
objs = new desc.value.constructor(desc.value.source, desc.value.flags)
} else if (desc.value.__proto__.__proto__ && desc.value.__proto__.__proto__.constructor === HTMLElement) {
objs = document.createElement(desc.value.nodeName)
} else {
objs = new desc.value.constructor()
}
Object.defineProperty(target, names[i], {
configurable: desc.confugurable,
enumerable: desc.enumerable,
writable: desc.writable,
value: objs
})
clone(desc.value, objs)
} else {
Object.defineProperty(target, names[i], desc)
}
}
return target
}
原生js实现一个深拷贝
最新推荐文章于 2023-10-12 20:25:11 发布