深入理解JavaScript中的对象复制(Object Clone)


Posted in Javascript onMay 18, 2016

JavaScript中并没有直接提供对象复制(Object Clone)的方法。因此下面的代码中改变对象b的时候,也就改变了对象a。

a = {k1:1, k2:2, k3:3};

b = a;

b.k2 = 4;

如果只想改变b而保持a不变,就需要对对象a进行复制。

用jQuery进行对象复制

在可以使用jQuery的情况下,jQuery自带的extend方法可以用来实现对象的复制。

a = {k1:1, k2:2, k3:3};

b = {};

$.extend(b,a);

自定义clone()方法来实现对象复制

下面的方法,是对象复制的基本想法。

Object.prototype.clone = function() {
 var copy = (this instanceof Array) ? [] : {};
 for (attr in this) {
  if (!obj.hasOwnProperty(attr)) continue;
  copy[attr] = (typeof this[i] == "object")?obj[attr].clone():obj[attr];
 } 
 return copy;
};


a = {k1:1, k2:2, k3:3};
b = a.clone();

下面的例子则考虑的更全面些,适用于大部分对象的深度复制(Deep Copy)。

function clone(obj) {
  // Handle the 3 simple types, and null or undefined
  if (null == obj || "object" != typeof obj) return obj;

  // Handle Date
  if (obj instanceof Date) {
    var copy = new Date();
    copy.setTime(obj.getTime());
    return copy;
  }

  // Handle Array
  if (obj instanceof Array) {
    var copy = [];
    for (var i = 0, var len = obj.length; i < len; ++i) {
      copy[i] = clone(obj[i]);
    }
    return copy;
  }

  // Handle Object
  if (obj instanceof Object) {
    var copy = {};
    for (var attr in obj) {
      if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
    }
    return copy;
  }

  throw new Error("Unable to copy obj! Its type isn't supported.");
}

以上这篇深入理解JavaScript中的对象复制(Object Clone)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
Apr 12 Javascript
Javascript面向对象编程(三) 非构造函数的继承
Aug 28 Javascript
JavaScript中的null和undefined解析
Apr 14 Javascript
AngularJS基础学习笔记之控制器
May 10 Javascript
javascript动态创建表格及添加数据实例详解
May 13 Javascript
ClearTimeout消除闪动实例代码
Feb 29 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
Jun 22 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
Mar 09 Javascript
zTree jQuery 树插件的使用(实例讲解)
Sep 25 jQuery
JavaScript实现的DOM绘制柱状图效果示例
Aug 08 Javascript
如何基于原生javaScript生成带图片的二维码
Nov 21 Javascript
vue实现简易的双向数据绑定
Dec 29 Vue.js
js验证框架实现代码分享
May 18 #Javascript
在JavaScript中对HTML进行反转义详解
May 18 #Javascript
深入理解JavaScript中的浮点数
May 18 #Javascript
Node.js返回JSONP详解
May 18 #Javascript
noty ? jQuery通知插件全面解析
May 18 #Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
May 18 #Javascript
jQuery实现图片向左向右切换效果的简单实例
May 18 #Javascript
You might like
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
PHP如何编写易读的代码
2007/07/10 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
详解package.json版本号规则
2019/08/01 Javascript
详解node.js 事件循环
2020/07/22 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
哥德堡通行证:Gothenburg Pass
2019/12/09 全球购物
一套C#面试题
2013/10/09 面试题
高中班长自我鉴定
2013/12/20 职场文书
餐厅楼面部长岗位职责范文
2014/02/16 职场文书
简单租房协议书范本
2014/08/20 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书