前言
网上有很多深度克隆的例子方法,很多都不是很完美,要嘛遇到null或者undefined会报错,要嘛数组类型有问题,或者函数丢失,更多的是直接定义一个方法去调用,没有直接通过原型实现调用起来来得方便,随手写个记录下
实现代码
//原型上增加深度克隆方法
Object.prototype.clone = function() {
function isNullOrUndefined(val){
return val === null || val === undefined
}
if (Array.isArray(this)) { //数组类型
return this.map(item => {
return isNullOrUndefined(item) ? item : item.clone()//null和undefined无原型直接返回
})
} else if (Object.prototype.toString.call(this) === '[object Object]') {//对象类型
let obj = {}
for (let key in this) {
if (this.hasOwnProperty(key)) {
obj[key] =isNullOrUndefined(this[key]) ? this[key] : this[key].clone()
}
}
return obj
}
return this.valueOf()//其他类型(基本类型或函数)
}
调用 object.clone()
let obj={
a:[1,2,null],
b:undefined,
c:{
m:1
},
d:function(){}
}
let deepCloneObj= obj.clone()
deepCloneObj.a[1]='test'
deepCloneObj.c.m='test'
console.log(deepCloneObj,'deepCloneObj')
console.log(obj.clone(), 'deepClone')
打印结果