JavaScript 对象的深复制
对象的深复制
- 源对象的属性更改,不会引起复制后的对象个属性的更改
- 源对象的任何属性与子属性与新对象的之间没有任何引用关系
Coding:
/* 对象的深复制: 1 初始化目标对象 如果没有指定目标对象,则利用源对象的构造函数创建目标对象,判断源对象类型,正则对象和日期对象分开复制 如果源对象是正则对象,抽取源对象属性source和flag放入构造参数中新建目标对象 如果源对象是日期对象,抽取源对象放入构造参数中新建目标对象 2 复制属性并返回结果 以数组形式获取源对象的所有属性名 遍历数组,获取每个属性名对象的属性描述对象 如果属性值是对象: 将源对象的属性描述对象设置到对应的目标对象属性里面去 考虑到属性对象可能存在嵌套,将当前属性value设置为属性描述对象value的递归遍历结果 如果属性值是函数: 正则提取函数参数和函数体内容,使用构造函数创建的形式将参数传进去 设置value为fn,其他三个描述属性参照描述属性对象 如果属性值不是函数也不是对象,只是普通属性,那么直接将源属性对应的属性名和属性描述设置给目标属性 */ function cloneObject(sourceObj, targetObj) { if (!sourceObj) return {}; if (!targetObj) { targetObj = new sourceObj.constructor(); switch (targetObj.constructor) { case RegExp: targetObj = new RegExp(sourceObj.source, sourceObj.flag); break; case Date: targetObj = new Date(sourceObj); break; } } var names = Object.getOwnPropertyNames(sourceObj); for (var i = 0; i < names.length; i++) { var desc = Object.getOwnPropertyDescriptor(sourceObj, names[i]); if (typeof desc.value === "object") { var o = cloneObject(desc.value); Object.defineProperty(targetObj, names[i], { configurable: desc.configurable, enumerable: desc.enumerable, writable: desc.writable, value: o }); } else if (typeof desc.value === "function") { var fnStr = desc.value.toString().replace(/\n/g, ""); //非贪婪匹配,满足情况只取一次 var arg = fnStr.match(/\((.*?)\)/)[1]; //贪婪匹配,取{}的任意字符 var content = fnStr.match(/{(.*)}/)[1]; var fn = new Function(arg, content); //设置函数名 Object.defineProperty(fn, "name", { writable: true, value: desc.value.name }); Object.defineProperty(targetObj, names[i], { configurable: desc.configurable, enumerable: desc.enumerable, writable: desc.writable, value: fn }); } else { Object.defineProperty(targetObj, names[i], desc); } } return targetObj; }
运行结果:
JavaScript 对象的深复制的更多相关文章
- javascript中关于深复制与浅复制的问题
在javascript中,变量的类型分为基本类型和引用类型. 对于基本类型的变量来说,值的复制以及作为函数参数实参传递的过程都是值的复制传递,换句话说,是会在内存中开辟出一个新空间用于存放新的值的.这 ...
- JavaScript对象的深浅复制
前言 从层次上来看,对象的复制可以简单地分为浅复制和深复制,顾名思义,浅复制是指只复制一层对象的属性,不会复制对象中的对象的属性,对象的深复制会复制对象中层层嵌套的对象的属性. 在复制对象时,除了要复 ...
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:
OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向 ...
- java对象实现深复制的方法
p2 = (Person)org.apache.commons.lang3.ObjectUtils.cloneBean(p); Person p2 = new Person(); p2 = (Pers ...
- javascript 中的深复制 和 其实现方法
首先,我们需要明白什么是深复制(侧重指对象方面)? 在javascript中,复制分为浅复制和深复制,个人理解,浅复制就是直接将引用复制,复制前后的两个对象指向同一个内存地址,对其中一个进行操作,另外 ...
- js 复制对象的深复制与浅复制
1.潜复制(修改新对象会改变原对象) var baz = {a:'hello', b: {c:'my', d:'friend'}} var foo = baz foo.a="better&q ...
- C# 对象的深复制和浅复制
2019年第一篇博客,好吧,又大了一岁了,继续加油吧. 正文: C# 中的对象,众所周知是引用类型,那么如何复制对象Object呢,我们来看看下面这段代码: public class User { p ...
- js 对象的深复制 解决不能复制undefined (递归)
用普通的拷贝 JSON.parse和 JSON.stringify 进行对象拷贝是不会拷贝undefined //普通的拷贝 const obj = { a: { ...
随机推荐
- 问题解决:局域网内,为啥别人ping不到我的IP
试着在本地搭建一个测试环境,成功后却发现同一局域网的同事根本访问不了,他们ping不到我的IP,这可咋整! 询问度娘后,我的问题得到了,以下是我的总结,如果解决不了你的问题,还请继续百度. 方法一:关 ...
- Spring boot --- 自动配置
spring boot 自动配置 指的是针对很多spring 应用程序常见的应用功能,spring boot 能自动提供相关配置. spring boot 自动配置加载 Spring boot ...
- 【资源分享】Gmod日志记录脚本
*----------------------------------------------[下载区]----------------------------------------------* ...
- Django 初试水(二)
这部分链接上一部分.将建立数据库,创建第一个模型,并主要关注 Django 提供的自动生成的管理页面. 打开 mysite/setting.py 文件.这包含了 Django 项目设置的 Python ...
- 【转载】Java嵌入Pig编程
转自:https://wiki.apache.org/pig/EmbeddedPig Embedding Pig In Java Programs Sometimes you want more co ...
- Nginx之反向代理
所谓,反向代理就是,客户端向A服务器地址发送请求,A服务器接收到客户端请求后又将请求转发给了B服务器,最后又将B服务响应的数据响应给了客户端. 通过配置文件,可以实现Nginx的反向代理. 代码: s ...
- vue组件引入
/src/route/index.js import Demo2 from '@/pages/demo2/index.vue' { path : '/demo2', name : 'demo2', c ...
- MySql5.6表操作
MySql5.6表操作 数据类型 整型 浮点型 字符类型 日期类型 枚举类型与集合类型 约束条件 Primary key Unique key Not null Foreign key 创建表的完整语 ...
- QImage和IplImage转换总结
在arm中做图像处理,因为不支持GTK,一般都会用到QT来实现显示功能,所以不可避免的要涉及到QImage和IplImage两种图像格式之间的转换,下面总结一下转换的方法. (下面格式转换的代码都是网 ...
- CSP2019第一轮游记
Day -1 发现还有\(2\)天就初赛了\((?)\) 赶紧复习\(ing\) 然后基础知识基本上都不知道 后面的大题--全靠蒙 感觉第一轮就要\(\mathrm{AFO}\)啊\(QwQ\) Da ...