js 对象克隆方法总结(不改变原对象)
1.通用对象克隆:
function clone(obj){
let temp = null;
if(obj instanceof Array){
temp = obj.concat();
}else if(obj instanceof Function){
//函数是共享的是无所谓的,js也没有什么办法可以在定义后再修改函数内容
temp = obj;
}else{
temp = new Object();
for(let item in obj){
let val = obj[item];
temp[item] = typeof val == 'object'?clone(val):val; //这里也没有判断是否为函数,因为对于函数,我们将它和一般值一样处理
}
}
return temp;
}
整个clone函数的思路可能有点乱,但是可以这样理顺:
把obj的value当做只有普通值、数组和函数,先按部就班地处理,然后再考虑之前的“普通值”有可能是object,所以这里做个判断,在递归一下clone函数就可以了
换用toSting()方法克隆:
思路:
ps:值得注意的是,官方有一种方法可以生成新的函数实例,就是bind()
function aaa(){
console.log(this);
};
var c = aaa;
var d = aaa.bind(); //bind如果不传东西,默认是window对象
c === aaa; //true
d === aaa; //false
2.JSON对象序列化方法
这个方法明显是简单得多,但是有个弊端,就是不能复制函数
var obj = {a:1,b:2}
var newObj = JSON.parse(JSON.stringify(obj));
obj.c = 3;
console.log(obj,newObj);
3.dom元素的复制——cloneNode
<div id="box"></div>
let div = document.getElementById('box');
let box2 = div.cloneNode(true);
console.log(div,box2);
4.es6新方法——Object.assign
//比较常用
var obj = {a:1,b:2}
var newObj = Object.assign({}, obj);
obj.c = 3;
console.log(obj,newObj);
5.es6新方法——扩展运算符(...)
var obj = {a:1,b:2}
var newObj ={...obj}
obj.c = 3;
console.log(obj,newObj);
js 对象克隆方法总结(不改变原对象)的更多相关文章
- JS 数组克隆方法总结(不可更改原数组)
ES5 方法总结 1.slice let arr = [2,4,434,43]; let arr1= arr.slice();//let arr1 = arr.slice(0); arr[0] = ' ...
- call by value reference name python既不是按值传递也不是按引用传递 python复制原理 创建新对象 与 改变原对象
按名调用 Algol 按值调用 Java https://docs.python.org/3.6/faq/programming.html#how-do-i-write-a-function-with ...
- python类、对象、方法、属性之类与对象笔记
python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...
- js对象克隆方法
方法1: function clone(obj){ var o; switch(typeof obj){ case 'undefined': break; case 'string' : o = ob ...
- js中Object.defineProperties 定义一个在原对象可读可写的方法
function A(){ this.name = 'hellow word'; } Object.defineProperties( A.prototype,{ doSomething2 : { v ...
- JS 数组克隆方法总结
ES5 方法总结 1.slice let arr = [2,4,434,43] let arr1= arr.slice() arr[0] = 'a' console.log(arr,arr1) // ...
- 【转】对象克隆(C# 快速高效率复制对象另一种方式 表达式树)
原文地址:https://www.cnblogs.com/lsgsanxiao/p/8205096.html 1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: p ...
- 对象克隆(C# 快速高效率复制对象另一种方式 表达式树转)
1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } publi ...
- js常用内置对象及方法
在js中万物皆对象:字符串,数组,数值,函数...... 内置对象都有自己的属性和方法,访问方法如下: 对象名.属性名称: 对象名.方法名称 1.Array数组对象 unshift( ) 数组开 ...
随机推荐
- ToDoList--HttpMediaTypeNotSupportedException
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-url ...
- 详细讲解redis数据结构(内存模型)以及常用命令
Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sor ...
- [cf113d]Museum
传送门 Solution 设一个状态为 \((x,y)\) 表示两人在的位置,求出每个状态期望出现的次数 设一个状态为 \(u\) , \(x_u^0=[u==(a,b)]\) 所以一个状态出现的次数 ...
- udev工作流程简图
- [Gamma]阶段测试报告
后端测试 我们进行了覆盖性测试,覆盖率达到77%. Beta阶段发现的Bug 项目显示的图片错误 无法使用搜索框 发布实验室项目的按钮点击无法跳转 连续点击发帖按钮可能发出多个相同的帖子 不需要点击我 ...
- websocket通信1009错误,
问题说明: springboot继承 WebSocketConfigurer实现websocket通信服务,服务器端报错,"The decoded text message was too ...
- 加入mapstruct后出现 找不到符号 符号: 方法 setXX 的解决方法
加入lombok解决 <build> <plugins> <plugin> <groupId>org.springframework.boot</ ...
- C# ini配置文件操作类
/// <summary> /// INI文件操作类 /// </summary> public class IniFileHelper { /// <summary&g ...
- PHP微信发红包简明教程
PHP微信发红包简明教程1首先进入公众号申请微信支付 申请成功账号密码会发到你指定的邮箱 是登陆商户平台的2 进入后申请发红包借口3 调用发红包接口 https://api.mch.weixin.qq ...
- 关于ThinkPHP独立分组的一些使用注意事项
关于ThinkPHP的独立分组,功能看上去挺好的,可是官方并没有给出详细的例子和说明,在此,根据实际的开发过程,给予各位php开发人员以下几点说明: 1.独立分组的目录结构 和官方说明一样,建立Mod ...