JavaScript对象之深度克隆介绍


Posted in Javascript onDecember 08, 2014

也不知道从什么时候开始,前端圈冒出了个新词:对象深度克隆。看起来好像很高大上的样子,实际上并不新鲜,在我们的实际项目开发中,你可能早已用到,只不过由于汉字的博大精深,有些原本很简单的事物被一些看似专业的词汇稍加修饰,就变得神秘起来了。

首先为什么要将一个对象进行深克隆?请允许我进行一个猜测:你有时一定会认为js的内置对象document太长,那么你可能会这样做:

var d = document;

d.by = function(id){

    return d.getElementById(id);

};

d.by('id').innerHTML = 'hello sentsin';

上述代码对document.getElementById进行了简化,同时在原document对象中也增加了一个by的成员方法,你可以通过document.hasOwnProperty('by')返回的状态值来验证你的判断。再看下面一个例子。

var person = {name: '贤心', profession: '前端开发', place: '杭州'};

var newPerson = person;

newPerson.age = '24';

console.log(person);

//结果:{name: '贤心', profession: '前端开发', place: '杭州', age: 24}

由此可见,将一个对象通过简单的传递给一个新的变量时,仅仅只是给该对象增添了一个别名。这意味着,通过对该别名的操作,原有对象键值会发生改变。但问题在于,有时我们希望newPerson完全独立于person,彼此之间不存在同步关系,那么就需要生成一个副本,请看例子:

var cloneObj = function(obj){

    var str, newobj = obj.constructor === Array ? [] : {};

    if(typeof obj !== 'object'){

        return;

    } else if(window.JSON){

        str = JSON.stringify(obj), //系列化对象

        newobj = JSON.parse(str); //还原

    } else {

        for(var i in obj){

            newobj[i] = typeof obj[i] === 'object' ? 

            cloneObj(obj[i]) : obj[i]; 

        }

    }

    return newobj;

};


//测试

var obj = {a: 0, b: 1, c: 2};

var arr = [0, 1, 2];

//执行深度克隆

var newobj = cloneObj(obj);

var newarr = cloneObj(arr);

//对克隆后的新对象进行成员删除

delete newobj.a;

newarr.splice(0,1);

console.log(obj, arr, newobj, newarr);

//结果: {a: 0, b: 1, c: 2}, [0, 1, 2], {b: 1, c: 2}, [1, 2];

这便是所谓的对象克隆。不过有几处需要解释一下。代码中的JSON对象及其成员方法stringify和parse属于ECMAScript5规范,它们分别负责将一个对象(包括数组对象)转换成字符串,和还原,从而实现对象的深拷贝。那么对于低级浏览器(如IE),拷贝数组的话,可以用newobj.concat(obj),而普通对象,就索性枚举赋值好了。

Javascript 相关文章推荐
关于Aptana Studio生成自动备份文件的解决办法
Dec 23 Javascript
DOM_window对象属性之--clipboardData对象操作代码
Feb 03 Javascript
js实现双向链表互联网机顶盒实战应用实现
Oct 28 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
Oct 24 Javascript
Jquery插件easyUi表单验证提交(示例代码)
Dec 30 Javascript
seaJs的模块定义和模块加载浅析
Jun 06 Javascript
不使用ajax实现无刷新提交表单
Dec 21 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
学习AngularJs:Directive指令用法(完整版)
Apr 26 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
Sep 22 Javascript
Vue获取微博授权URL代码实例
Nov 04 Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 #Javascript
JavaScript中的ArrayBuffer详细介绍
Dec 08 #Javascript
JS实现仿京东淘宝竖排二级导航
Dec 08 #Javascript
js继承call()和apply()方法总结
Dec 08 #Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
Dec 08 #Javascript
详解Javascript动态操作CSS
Dec 08 #Javascript
jquery.ajax之beforeSend方法使用介绍
Dec 08 #Javascript
You might like
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
jQuery常用数据处理方法小结
2015/02/20 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
微信小程序使用map组件实现路线规划功能示例
2019/01/22 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
vue实现图片上传功能
2020/05/28 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
详解Python中的日志模块logging
2015/06/19 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
Django中的静态文件管理过程解析
2019/08/01 Python
python图形用户接口实例详解
2019/12/16 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
python opencv进行图像拼接
2020/03/27 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
全球最大的网上自行车商店:Chain Reaction Cycles
2016/12/02 全球购物
一个SQL面试题
2014/08/21 面试题
《生命的药方》教学反思
2014/04/08 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
《谁的本领大》教后反思
2014/04/25 职场文书
大学国际贸易专业自荐信
2014/06/05 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
团支部书记竞选稿
2015/11/21 职场文书