Fork me on GitHub

JS深层继承

我们在书写JS的时候常常被一种现象困扰

1 let jsonA = {
2   a1: {
3     b1:1;
4   },
5 };
6 let jsonB = jsonA;
7 jsonB.a1.b1 = 2;
8 console.log(jsonA.a1.b1) // 此时输出2;

又或者 

 1 let jsonA = {
 2   a1: {
 3     b1: 1
 4   }
 5 };
 6 let jsonB = {
 7   a1: {
 8     c1: 1
 9   }
10 };
11 let jsonC = Object.assign(jsonA, jsonB);
12 console.log(JSON.stringify(jsonC)); // 输出 {"a1":{"c1":1}}

啦啦啦,b1不见了!

这是因为引用类型的关系,值类型和引用类型的区别请自行查询,这里就不赘述了。

那要如何解决呢?

一、实现深层拷贝

 1 /**
 2  * 实现json对象的深层拷贝
 3  * @parent 需要拷贝的原对象
 4  * @child  返回的拷贝完成的对象(参数可省略)
 5  */
 6 function copyDeeply (parent, child) {
 7   child = child || {};
 8   for (var prop in parent) {
 9     // 如果属性本身,就是一个数组或者Json对象,进行深拷贝
10     if (typeof parent[prop] === 'object') {
11       // 确定子对象的属性类型,[]或者{}对象
12       child[prop] = (parent[prop].constructor === Array) ? [] : {};
13       // 实现深拷贝
14       copyDeeply(parent[prop], child[prop]);
15     } else {
16       child[prop] = parent[prop];
17     }
18   }
19   return child;
20 }

二、实现深层继承

 1 /**
 2  * 实现json对象的深层继承
 3  * @parent 被继承原对象
 4  * @child  继承对象(把child对象继承到parent)
 5  * @result  最终生成的结果对象(参数可省略)
 6  */
 7 function extendDeeply (parent, child, result) {
 8   result = result || copyDeeply(parent);
 9   for (var prop in child) {
10     // 如果属性本身,就是一个数组或者Json对象,进行深拷贝
11     if (child[prop].constructor === Object) {
12       result[prop] = result[prop] || {};
13       // 实现深拷贝
14       extendDeeply(parent[prop], child[prop], result[prop]);
15     } else {
16       result[prop] = child[prop];
17     }
18   }
19   return result;
20 }

这样就可以解决上面所述的问题了

 

 本文章持续更新中。。。

posted @ 2017-11-03 16:41  Tonny的学习笔记  阅读(344)  评论(0编辑  收藏  举报