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。��