JS对象的深度克隆方法示例


Posted in Javascript onMarch 16, 2017

本文实例讲述了JS对象的深度克隆方法。分享给大家供大家参考,具体如下:

js中创建的对象指向内存,所以在开发过程中,往往修改了一个对象的属性,会影响另外一个对象。

尤其是在angular框架中,dom是由数据驱动的,在增删改查对象的操作中,对象属性的继承关系是很让人头痛的!

我之前遇到的问题就是,在编辑页面,操作了对象数据,影响到了展示数据的展现!

我整理了两种深度克隆对象的方法,供大家参考!

首先var 一个假数据

var schedule = {"status":21,"msg":"ok","data":[{"name":"lemon","age":21,"contactList":{"phone":[152,153,154],"email":5295}},{"name":"lara","age":22,"contact":{"phone":152,"email":5295}}]}

方法1:

遍历自身,判断当前对象是obj还是list,克隆出新对象

function deepClone(obj)
{
  var o,i,j,k;
  if(typeof(obj)!="object" || obj===null)return obj;
  if(obj instanceof(Array))
  {
    o=[];
    i=0;j=obj.length;
    for(;i<j;i++)
    {
      if(typeof(obj[i])=="object" && obj[i]!=null)
      {
        o[i]=arguments.callee(obj[i]);
      }
      else
      {
        o[i]=obj[i];
      }
    }
  }
  else
  {
    o={};
    for(i in obj)
    {
      if(typeof(obj[i])=="object" && obj[i]!=null)
      {
        o[i]=arguments.callee(obj[i]);
      }
      else
      {
        o[i]=obj[i];
      }
    }
  }
  return o;
}
var scheduleClone = deepClone(schedule)
scheduleClone.data[0].contactList.phone[0] = 99999999999
console.log('方法1 深度克隆')
console.log(scheduleClone)
console.log(JSON.stringify(schedule))
console.log(JSON.stringify(scheduleClone))

方法2:

用js原生的json序列化的方式,简单粗暴!

var scheduleClone2 = JSON.parse(JSON.stringify(schedule));
console.log('方法2 深度克隆')
console.log(scheduleClone2)
scheduleClone2.data[0].contactList.phone[0] = 8888888
console.log(JSON.stringify(schedule))
console.log(JSON.stringify(scheduleClone2))

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery选择器的工作原理和优化分析
Jul 25 Javascript
javaScript(JS)替换节点实现思路介绍
Apr 17 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
Sep 03 Javascript
jQuery实现行文字链接提示效果的方法
Mar 10 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
Sep 02 Javascript
用 js 的 selection range 操作选择区域内容和图片
Apr 18 Javascript
Vue中计算属性computed的示例解读
Jul 26 Javascript
微信小程序获取循环元素id以及wx.login登录操作
Aug 17 Javascript
详解Vue之计算属性
Jun 20 Javascript
解决vue无法侦听数组及对象属性的变化问题
Jul 17 Javascript
Vue环境搭建+VSCode+Win10的详细教程
Aug 19 Javascript
基于react项目打包css引用路径错误解决方案
Oct 28 Javascript
JS对象深度克隆实例分析
Mar 16 #Javascript
JS异步加载的三种实现方式
Mar 16 #Javascript
Bootstrap免费字体和图标网站(值得收藏)
Mar 16 #Javascript
基于JavaScript实现滑动门效果
Mar 16 #Javascript
基于Vue2.0的分页组件
Mar 16 #Javascript
原生js实现验证码功能
Mar 16 #Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 #Javascript
You might like
一个查看session内容的函数
2006/10/09 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php强制下载文件函数
2016/08/24 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
深入认识javascript中的eval函数
2009/11/02 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
浅谈javascript中的DOM方法
2015/07/16 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
Python去除列表中重复元素的方法
2015/03/20 Python
在Mac OS上搭建Python的开发环境
2015/12/24 Python
利用Anaconda完美解决Python 2与python 3的共存问题
2017/05/25 Python
python中类的属性和方法介绍
2018/11/27 Python
解析Python的缩进规则的使用
2019/01/16 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
python跳出双层for循环的解决方法
2019/06/24 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
如何教少儿学习Python编程
2020/07/10 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
机械设计专业应届生求职信
2013/11/21 职场文书
十佳大学生事迹材料
2014/01/29 职场文书
北京奥运会口号
2014/06/21 职场文书
商务经理岗位职责
2014/07/30 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
无刑事犯罪记录证明
2014/09/18 职场文书
党风廉政建设调研报告
2015/01/01 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书