原生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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值