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 }
这样就可以解决上面所述的问题了
本文章持续更新中。。。