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: { ...
随机推荐
- Linux - Shell - 算术表达式 - 算数运算
概述 shell 中基于 $(()) 的 算数运算 背景 复习 shell 脚本 凑数吧 准备 环境 os centos7 1. 算数运算 代码 #!/bin/bash # $(()) 的数学运算, ...
- TODO:如何模拟cpu打满,磁盘打满,网卡打满
背景: 测试活动中,需要构造cpu打满.磁盘打满.网卡打满的场景 场景1:cpu打满 环境信息: 虚拟机,物理核数16个,每个物理核的虚拟核数1个,虚拟核数16个: [root@vm10-0-0-8 ...
- 2019牛客多校第七场E Find the median 离散化+线段树维护区间段
Find the median 题意 刚开始集合为空,有n次操作,每次操作往集合里面插入[L[i],R[i]]的值,问每次操作后中位数是多少 分析 由于n比较大,并且数可以达到1e9,我们无法通过权值 ...
- Dimension reduction
materials: 1. Dimension Reduction - IsoMap
- (转)java垃圾回收二
转自:http://shuaijie506.iteye.com/blog/1779651 在网上看到一篇不错的文章,记录下来备忘. 要理解java对象的生命周期,我们需要要明白两个问题, 1.java ...
- json_encode中文不转义问题
//php5.3之后才有这个参数,这样存入数据库中的中文json数据就不会转义,也能被正确解析1JSON_UNESCAPED_UNICODE(中文不转为unicode ,对应的数字 256) JSON ...
- C#画图超出屏幕的部分无法显示的解决方法
C#画图超出屏幕的部分无法显示,通过AutoScrollMinSize属性及相关方法解决问题. 可以实现 到 的转变. 代码如下: using System.Drawing; using System ...
- 2.2 logistic回归损失函数(非常重要,深入理解)
上一节当中,为了能够训练logistic回归模型的参数w和b,需要定义一个成本函数 使用logistic回归训练的成本函数 为了让模型通过学习来调整参数,要给出一个含有m和训练样本的训练集 很自然的, ...
- Java爬虫学习(3)之用对象保存新浪微博博文
package com.mieba; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.c ...
- Nearest Interesting Number
Polycarp knows that if the sum of the digits of a number is divisible by 33, then the number itself ...