JS通过原型实现数据深度拷贝,兼容所有类型值

前言

网上有很多深度克隆的例子方法,很多都不是很完美,要嘛遇到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')

打印结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值