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

 let jsonA = {
  a1: {
    b1:1;
  },
};
let jsonB = jsonA;
jsonB.a1.b1 = 2;
console.log(jsonA.a1.b1) // 此时输出2;

又或者 

 let jsonA = {
  a1: {
    b1: 1
  }
};
let jsonB = {
  a1: {
    c1: 1
  }
};
let jsonC = Object.assign(jsonA, jsonB);
console.log(JSON.stringify(jsonC)); // 输出 {"a1":{"c1":1}}

啦啦啦,b1不见了!

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

那要如何解决呢?

一、实现深层拷贝

 /**
* 实现json对象的深层拷贝
* @parent 需要拷贝的原对象
* @child 返回的拷贝完成的对象(参数可省略)
*/
function copyDeeply (parent, child) {
child = child || {};
for (var prop in parent) {
// 如果属性本身,就是一个数组或者Json对象,进行深拷贝
if (typeof parent[prop] === 'object') {
// 确定子对象的属性类型,[]或者{}对象
child[prop] = (parent[prop].constructor === Array) ? [] : {};
// 实现深拷贝
copyDeeply(parent[prop], child[prop]);
} else {
child[prop] = parent[prop];
}
}
return child;
}

二、实现深层继承

 /**
* 实现json对象的深层继承
* @parent 被继承原对象
* @child 继承对象(把child对象继承到parent)
* @result 最终生成的结果对象(参数可省略)
*/
function extendDeeply (parent, child, result) {
result = result || copyDeeply(parent);
for (var prop in child) {
// 如果属性本身,就是一个数组或者Json对象,进行深拷贝
if (child[prop].constructor === Object) {
result[prop] = result[prop] || {};
// 实现深拷贝
extendDeeply(parent[prop], child[prop], result[prop]);
} else {
result[prop] = child[prop];
}
}
return result;
}

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

本文章持续更新中。。。

JS深层继承的更多相关文章

  1. JS对象继承篇

    JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...

  2. js实现继承的5种方式 (笔记)

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  3. js实现继承的方式总结

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  4. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  5. js实现继承的两种方式

    这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...

  6. js实现继承

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  7. 浅谈JS的继承

    JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...

  8. JS类继承常用方式发展史

    JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...

  9. js实现继承的5种方式

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

随机推荐

  1. Akka(26): Stream:异常处理-Exception handling

    akka-stream是基于Actor模式的,所以也继承了Actor模式的“坚韧性(resilient)”特点,在任何异常情况下都有某种整体统一的异常处理策略和具体实施方式.在akka-stream的 ...

  2. Linux 常用命令之二

    整理以前学习Linux的笔记. 查找目录.查看当前所在路径.新建文件.查看文件内容.修改文件内容.压缩文件操作.搜索命令.管道命令.查看进程.终止进程.查看端口. 7,命令find--查找目录 fin ...

  3. 微信公众号开发——关于“WeixinJSBridge.call('closeWindow');”无效的问题

    最近在做微信公众号的开发,再做一个jsp的用户绑定页面,设置了一个timestamp,想实现的是当链接超时时alert一个窗口提示然后关闭网页窗口 但是呢,在jsp页面内直接 out.print(&q ...

  4. 翻译:MariaDB wait/nowait

    本文为mariadb官方手册:wait/nowait的译文.原文:https://mariadb.com/kb/en/library/wait-and-nowait/ 从MariaDB 10.3.0开 ...

  5. 3.bootstrap-组件

    1.图标 <button type="button" class="btn btn-default"> <span class="g ...

  6. JSP入门 el表达式

    我们已经知道el是jsp-2.0规范的一部分,tomcat-5.x版本以上都已经能够支持jsp-2.0规范,但在更低版本的tomcat和webphere,weblogic中还是无法使用这一便捷方式. ...

  7. C#最基本的小说爬虫

    新手学习C#,自己折腾弄了个简单的小说爬虫,实现了把小说内容爬下来写入txt,还只能爬指定网站. 第一次搞爬虫,涉及到了网络协议,正则表达式,弄得手忙脚乱跑起来效率还差劲,慢慢改吧. 爬的目标:htt ...

  8. H5音频处理的一些小知识

      前  言 LiuDaP 十一过后,小编要做一个关于音乐播放器的项目,要用到大量H5音频处理的内容,于是在十月一日国庆黄金周闲暇之际,自己学习了一下H5音频的相关内容.虽然自学的没有那么深入,但是对 ...

  9. 前端基础之初识 HTML

    HTML HTML(Hypertext Markup Language)即超文本标记语言,是WWW的描述语言.设计HTML语言的目的是为了能把存放在一台电脑中的文本或图形与另一台电脑中的文本或图形方便 ...

  10. input 事件与汉字输入法:使用compositionend事件解决

    input 事件与汉字输入法:使用compositionend事件解决 在使用<input type="text">的input事件的时候 会遇到中文输入法的" ...