原生js实现一个深拷贝

// 可以用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实现一个深拷贝)