转: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)的三种方案相关推荐

  1. java深度克隆_浅析Java中clone()方法浅克隆与深度克隆

    现在Clone已经不是一个新鲜词语了,伴随着"多莉"的产生这个词语确实很"火"过一阵子,在Java中也有这么一个概念,它可以让我们很方便的"制造&qu ...

  2. WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式

    WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 由于WPF中没有提供PropertyGrid控 ...

  3. 对象转化为数组的三种方法

    对象转化为数组的三种方法: Object.keys(obj) -----根据对象的键形成的数组(常用) Object.entries(obj) ---- 根据对象的键值对形成的数组 Object.va ...

  4. java浅度克隆_java对象 深度克隆(不实现Cloneable接口)和浅度克隆

    为什么需要克隆: 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说 ...

  5. Java实现对象深度克隆

    两种方式:   1). 实现Cloneable接口并重写Object类中的clone()方法:   2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆 ...

  6. java deep clone util_Java Clone深拷贝与浅拷贝的两种实现方法

    1.首先,你要知道怎么实现克隆:实现Cloneable接口,在bean里面重写clone()方法,权限为public. 2.其次,你要大概知道什么是地址传递,什么是值传递. 3.最后,你要知道你为什么 ...

  7. 原型模式 —— Java的赋值、浅克隆和深度克隆的区别

    赋值 直接  = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...

  8. Java常见面试题:对象的访问定位的两种方式

    对象的访问定位的两种方式 java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象. 由于reference类型在java虚拟机规范中只规定了一个对象的引用 ...

  9. Java中将对象转换成String的三种方法

    日常开发中经常会有对象转成String类型这种场景,一般有三种方法 1.直接进行类型强转,(String) Object o = "2"; System.out.println(( ...

最新文章

  1. 个人--变成星星的孩子
  2. php参数一个字符串数组,PHP字符串控制台参数到数组
  3. Nordic nRF5 SDK和softdevice介绍
  4. 职工考勤管理信息系统数据库课设_数据库课程设计--职工考勤管理信息系统
  5. linux lua socket编程,CentOs 安装lua,luasocket
  6. Promise 让异步更优
  7. application.properties引用其他文件_企业级SpringBoot应用多个子项目配置文件规划、多环境支持(一)...
  8. 如何清理电脑c盘_【电脑】第一期干货:如何正确清理C盘?
  9. 加密芯片算法移植方案的优点
  10. 汇编语言实现简单的计算器
  11. linux终端输出图形_Linux进程关系
  12. asa清空配置_思科ASA防火墙基本配置
  13. json rpgmv 加密_RPGMakerMV探秘01-文件结构
  14. 调试AKM4432 DAC驱动问题记录
  15. 当你从美梦中惊醒的时候,你该做什么?
  16. 看看这个和runjs类似的网站jsrun
  17. python的staticmethod,classmethod和装饰器以及闭包的爱恨情仇
  18. JAVA巡云轻论坛系统源码
  19. 【ML】异常检测、PCA、混淆矩阵、调参综合实践(基于sklearn)
  20. jdk-18.0.0.1安装包下载安装教程

热门文章

  1. 接受了 CSDN 的《专家看台》采访
  2. 论文阅读 4 | A Survey on High-dimensional Gaussian Process Modeling with Application
  3. python三人同行七十稀_【算法入门第二章练习题】(示例代码)
  4. qq计算机丢失msvcp100,Windows7系统msvcr100.dll丢失怎么办?
  5. numpy 是否为零_python数据分析入门必刷!100道题掌握numpy
  6. php进销存 手机版_银鱼进销存app下载-银鱼进销存手机版 v1.4.6
  7. 在Linux上搭建PHP条形码阅读器
  8. 关于The connected J-Link is defective,Proper operation cannot be guaranteed.....
  9. HDU OJ ACM Steps 上的题目详细介绍
  10. Windows Server 2008 如何实现Vista主题