JS深层继承
我们在书写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深层继承的更多相关文章
- JS对象继承篇
JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...
- js实现继承的5种方式 (笔记)
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- js实现继承的方式总结
js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...
- 【09-23】js原型继承学习笔记
js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...
- js实现继承的两种方式
这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...
- js实现继承
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
- 浅谈JS的继承
JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...
- JS类继承常用方式发展史
JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...
- js实现继承的5种方式
js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...
随机推荐
- windows10 下安装node失败 出现2502 2503的解决办法
下载node出现以下异常 : the install has encountered an unexpected errer installing this package.this may i ...
- datepickerpopup时间限制选取
使用popup组件的过程中遇到时间选取的问题 官方文档大致说使用date和mode 可以解决,奈何老夫是看不懂,写的时候参考的有 官方文档.echo2016的博文.liumang361的博文 先看图 ...
- 说下browserslist
browserslist 是一个开源项目 见到有些package.json里会有如下的配置参数 "browserslist": [ "> 1%", &qu ...
- 用ES6巧妙的解决传统面试中的算法小问题!
最近自己也在准备面试,在复习算法的时候,机智的用了一波ES6.一起来瞧瞧吧! 1.数组的去重 var arr=str.split(''); for(var i=0;i<arr.length-1; ...
- TCP/IP(八)之总结ICP/IP四层模型
前言 在这里有一个问题,有的书上说TCP/IP是四层有的却说是五层.其实这个问题我也上网查了一下资料. tcp/ip是事实标准,分4层.osi模型是国际标准,分7层.讲课的时候,一般把他们综合起来讲, ...
- Java的类加载器
一.类加载器的概念 类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 ...
- Long Long Message (poj2774 后缀数组求最长公共子串)
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 19206 Accepted: 79 ...
- 统计学习方法——CART, Bagging, Random Forest, Boosting
本文从统计学角度讲解了CART(Classification And Regression Tree), Bagging(bootstrap aggregation), Random Forest B ...
- 使用jsonp完美解决跨域问题
调用web接口,get请求,发现提示:No 'Access-Control-Allow-Origin' header is present on the requested resource. 这个和 ...
- 简单Elixir游戏服设计-玩家进程跑起来
有了玩家模型,我们试试让玩家进程跑起来. 需要搞个PlayerSupervisor来负责启动和监控玩家进程. defmodule PlayerSupervisor do use Supervisor ...