编辑代码

let obj = {
    name: '游戏人生',
    fn: function () {
        console.log('空白')
    }
}

// 深拷贝函数,传入一个对象进来,即可
// return 一个全新的对象
function deepCopy(obj) {
    // 判断数据是以那种方式存储,对象?数组?
    let newObj = obj instanceof Array ? [] : {}

    // 循环每个数据
    for (let key in obj) {
        let value = obj[key]

        // 如果是 null,直接赋值
        if (value === null) {
            newObj[key] = null
            break
        }

        // 如果是 普通对象或数组,使用递归
        if (typeof value === 'object') {
            newObj[key] = deepCopy(value)
            break
        }

        // 如果是 函数 类型,使用 bind 生成一个新函数
        if (typeof value === 'function') {
            newObj[key] = value.bind(newObj)
            break
        }

        // 经过以上处理,特殊情况处理完了。
        // Number型、Boolean型、String型、undefined
        newObj[key] = value
    }

    // 返回深拷贝后的对象
    return newObj
}



let res = deepCopy(obj)

// 尝试修改函数,是否会影响到源函数
res.fn.flag = '老二刺螈了'

console.log('源的:' + obj.fn.flag)

console.log('新的:' + res.fn.flag)

res.fn()


// 测试发现:给函数新增新的 flag 属性,都没用影响到原函数。

// 到此可以发现:拷贝后的函数,是不会影响到源函数的。

// 正则、时间 这些对象没用处理的

// 感觉也必要去想这个,不是说市场上有成型的工具了嘛,稍微应付一下,未来可能遇到的变态 Hr。��