js笔记,自封装篇(二)之对象克隆

26 篇文章 0 订阅
20 篇文章 1 订阅

js笔记,自封装篇(二)之对象克隆

对象的指针

对象是一个复杂数据类型,声明一个对象就开辟一个空间然后给这个空间取个名字。而这个空间可以有多个名字,而空间只能有一个。什么意思呢?上代码:

var obj = {
	a: 1,
	b: 2
}
var obj1 = obj;
obj.c = 3;
obj.a = 8;
console.log(obj1.c); // 3
console.log(obj1.a); // 8

从上面的代码可以看出来,obj和obj1只是对象的两个名字而对象就是一个。ok我们再做个实验:

var obj = {
	a: 1,
	b: 2
}
var obj1 = obj;
console.log(obj == obj1); //true
console.log({} == {}); //false

说明obj和obj1 就是一个对象, 而两个空对象不相等更说明两个空对象属于两个不同的空间。那这就产生了一个问题,如果我们想复制一个对象出来,复制出来之后两个对象就断掉关系怎么办呢?

对象克隆

我们来想想办法,首先我们是不是要把对象中每一项拿出来搞搞呢:

var obj = {
	a: 1,
	b: 2
}
var obj1 = {}

for (var prop in obj) {
	obj1[prop] = obj[prop];
}
obj.a = 4;
console.log(obj1); // {a:1, b:2}


}

哈哈,看起来问题解决了,但是还有坑的! 上代码:

var obj = {
	list: {
		item1: 'a',
		item2: 'b',
	},
	arr: [1, 2, 3]
}

var obj1 = {}

for (var prop in obj) {
	obj1[prop] = obj[prop];
}
obj.arr[0] = 5;
console.log(obj1.arr[0]); // 5

艾玛呀。。。看来科隆的不够深,上面的代码我们可以看出来,原始值是没有问题的,主要是引用值,而引用值主要是对象和数组,我们首先要先判断一下是数组还是对象,然后再分别处理,那该怎么办呢?好办:

function copy(a, b) {
	var b = b || {},
		tosrt = Object.prototype.toString,
		s = "[object Array]";
	for (var prop in a) {
		if (a.hasOwnProperty(prop)) { // 不克隆原型链欧
			if (typeof (a[prop]) == 'object' &&  a[prop] != null) { //首先判断是不是引用值
				if (tosrt.call(a[prop]) == '[object Array]') { // 判断是数组还是对象
					b[prop] = [];
				} else {
					b[prop] = {};
				}
				copy(a[prop], b[prop]);
			} else {
				b[prop] = a[prop];
			}
		}
	}

我觉得自己封装的很完美,如有不妥请拍砖!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值