java deep clone util_实现对象深度克隆(deepClone)的三种方案
转:http://www.cnblogs.com/wangzhichao/archive/2013/04/11/3014419.html
方案一:利用现代浏览器支持的JSON对象做一次中转,实现深度克隆。(IE6、IE7不支持原生JSON对象,可载入json2.js补丁来达到兼容)感谢rekey提供此方案。JSON.stringify()与JSON.parse()详细信息请点击这里
var deepClone = function(obj) {var_tmp,result;
_tmp=JSON.stringify(obj);
result=JSON.parse(_tmp);returnresult;
}var obj1 = {family:{brother:"wangzhipeng",father:"wanglicai",mother:"sunaiyun"},name:"gino",sex:"male",age:"27"};var obj2 =deepClone(obj1);
obj1.family.brother= "close";
console.log(obj1);
console.log(obj2);
方案二:确定参数类型为object (这里仅指object literal、Array literal)后,复制源对象的键/值到目标对象,否则直接返回源对象。
注:下面这个函数只能说基本满足生产需求,如果参数是Dom对象、new Object ()的话,就会产生功能性错误,要兼容参数的所有数据类型,请参考:http://stackoverflow.com/a/4460624/2109599
var deepClone = functionfnDeepClone(obj){var result = typeof obj.splice === 'function'?[]:{},
key;if (obj && typeof obj === 'object'){for (key inobj ){if (obj[key] && typeof obj[key] === 'object'){
result[key]= fnDeepClone(obj[key]);//如果对象的属性值为object的时候,递归调用deepClone,即再把某个值对象复制一份到新的对象的对应值中 }else{
result[key]= obj[key];//如果对象的属性值不为object的时候,直接复制参数对象的每一个键/值到新对象对应的键/值中 }
}returnresult;
}returnobj;
}//test array var arry1= ["a","b","c","d"];var arry2 =deepClone(arry1);
arry1.pop();
console.log(arry1);
console.log(arry2);//test object var obj1 = {name:"gino",sex:"male",age:27,favorite:"pingpang",family:{brother:"zhipeng",mother:"SunAiyun",father:"WangLicai"}};var obj2 =deepClone(obj1);
obj1.family.brother= "close";
console.log(obj1);
console.log(obj2);
方案三:利用数组的Array.prototype.forEach和其他一些ECMAScript 5中的Object.*函数。经测试,当值的类型为object的时候,会出现功能错误。个人水平有限,没看懂这个函数,如有朋友能帮忙修正下此函数,万分感激。 链接
var deepClone = function(o){var copy =Object.create( Object.getPrototypeOf(o) );var propNames =Object.getOwnPropertyNames(o);
propNames.forEach(function(name){var desc =Object.getOwnPropertyDescriptor(o, name);
Object.defineProperty(copy, name, desc);
});returncopy;
}var obj1 = {family:{brother:"wangzhipeng",father:"wanglicai",mother:"sunaiyun"},name:"gino",sex:"male",age:"27"};var obj2 =deepClone(obj1);
obj1.sex= "close";
console.log(obj1);
console.log(obj2);
java deep clone util_实现对象深度克隆(deepClone)的三种方案相关推荐
- java深度克隆_浅析Java中clone()方法浅克隆与深度克隆
现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...
- WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式
WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 由于WPF中没有提供PropertyGrid控 ...
- 对象转化为数组的三种方法
对象转化为数组的三种方法: Object.keys(obj) -----根据对象的键形成的数组(常用) Object.entries(obj) ---- 根据对象的键值对形成的数组 Object.va ...
- java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆
为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...
- Java实现对象深度克隆
两种方式: 1). 实现Cloneable接口并重写Object类中的clone()方法: 2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆 ...
- java deep clone util_Java Clone深拷贝与浅拷贝的两种实现方法
1.首先,你要知道怎么实现克隆:实现Cloneable接口,在bean里面重写clone()方法,权限为public. 2.其次,你要大概知道什么是地址传递,什么是值传递. 3.最后,你要知道你为什么 ...
- 原型模式 —— Java的赋值、浅克隆和深度克隆的区别
赋值 直接 = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...
- Java常见面试题:对象的访问定位的两种方式
对象的访问定位的两种方式 java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象. 由于reference类型在java虚拟机规范中只规定了一个对象的引用 ...
- Java中将对象转换成String的三种方法
日常开发中经常会有对象转成String类型这种场景,一般有三种方法 1.直接进行类型强转,(String) Object o = "2"; System.out.println(( ...
最新文章
- 个人--变成星星的孩子
- php参数一个字符串数组,PHP字符串控制台参数到数组
- Nordic nRF5 SDK和softdevice介绍
- 职工考勤管理信息系统数据库课设_数据库课程设计--职工考勤管理信息系统
- linux lua socket编程,CentOs 安装lua,luasocket
- Promise 让异步更优
- application.properties引用其他文件_企业级SpringBoot应用多个子项目配置文件规划、多环境支持(一)...
- 如何清理电脑c盘_【电脑】第一期干货:如何正确清理C盘?
- 加密芯片算法移植方案的优点
- 汇编语言实现简单的计算器
- linux终端输出图形_Linux进程关系
- asa清空配置_思科ASA防火墙基本配置
- json rpgmv 加密_RPGMakerMV探秘01-文件结构
- 调试AKM4432 DAC驱动问题记录
- 当你从美梦中惊醒的时候,你该做什么?
- 看看这个和runjs类似的网站jsrun
- python的staticmethod,classmethod和装饰器以及闭包的爱恨情仇
- JAVA巡云轻论坛系统源码
- 【ML】异常检测、PCA、混淆矩阵、调参综合实践(基于sklearn)
- jdk-18.0.0.1安装包下载安装教程
热门文章
- 接受了 CSDN 的《专家看台》采访
- 论文阅读 4 | A Survey on High-dimensional Gaussian Process Modeling with Application
- python三人同行七十稀_【算法入门第二章练习题】(示例代码)
- qq计算机丢失msvcp100,Windows7系统msvcr100.dll丢失怎么办?
- numpy 是否为零_python数据分析入门必刷!100道题掌握numpy
- php进销存 手机版_银鱼进销存app下载-银鱼进销存手机版 v1.4.6
- 在Linux上搭建PHP条形码阅读器
- 关于The connected J-Link is defective,Proper operation cannot be guaranteed.....
- HDU OJ ACM Steps 上的题目详细介绍
- Windows Server 2008 如何实现Vista主题