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()方法克隆:
思路:
  //1.遍历对象              for(var prop in obj)
  //2.判断要复制的属性是否是原始值    typeof(obj[prop])
  //3.判断要复制的属性是数组还是对象   toString(建议使用)   instanceof   constructor
  //4.创建对应的数组和对象
 
instanceof:  a instanceof b  判断对象a是否在构造函数b的原型链上
 
 
  function deepClone(origin, target) {
    var target = target || {};
    toStr = Object.prototype.toString, //对象调用toSting()
    arrStr = "[obect Array];"
    for(var prop in origin) {
    if(origin.hasOwnProperty(prop)) { //判断是否是原型上的属性还是自己的属性
      if(origin[prop] !== "null" && typeof(origin[prop]) == "object") { //判断是数组还是对象且复制者不能为空
        if(toStr.call(origin[prop]) == arrStr) {
          target[prop] = [];
        } else {
          target[prop] = {};
        }
          deepClone(origin[prop], target[prop]);
        } else {
          target[prop] = origin[prop];  //递归调用
        }
      }
    }
    return target;
  }

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 对象克隆方法总结(不改变原对象)的更多相关文章

  1. JS 数组克隆方法总结(不可更改原数组)

    ES5 方法总结 1.slice let arr = [2,4,434,43]; let arr1= arr.slice();//let arr1 = arr.slice(0); arr[0] = ' ...

  2. 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 ...

  3. python类、对象、方法、属性之类与对象笔记

    python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性(特征)和行为来描述一个对象的.比如家里的小狗, ...

  4. js对象克隆方法

    方法1: function clone(obj){ var o; switch(typeof obj){ case 'undefined': break; case 'string' : o = ob ...

  5. js中Object.defineProperties 定义一个在原对象可读可写的方法

    function A(){ this.name = 'hellow word'; } Object.defineProperties( A.prototype,{ doSomething2 : { v ...

  6. JS 数组克隆方法总结

    ES5 方法总结 1.slice let arr = [2,4,434,43] let arr1= arr.slice() arr[0] = 'a' console.log(arr,arr1) // ...

  7. 【转】对象克隆(C# 快速高效率复制对象另一种方式 表达式树)

    原文地址:https://www.cnblogs.com/lsgsanxiao/p/8205096.html 1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: p ...

  8. 对象克隆(C# 快速高效率复制对象另一种方式 表达式树转)

    1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; } publi ...

  9. js常用内置对象及方法

    在js中万物皆对象:字符串,数组,数值,函数...... 内置对象都有自己的属性和方法,访问方法如下: 对象名.属性名称: 对象名.方法名称 1.Array数组对象 unshift( )    数组开 ...

随机推荐

  1. 查看linux服务器配置信息命令

    查看 cpu信息: cat /proc/cpuinfo 查看内存信息: grep MemTotal /proc/meminfo 查看操作系统信息: uname -a 查看centos版本信息: cat ...

  2. 小程序开发第一天josn和wxml

    视频中只有app.josn路径还有wxm文本.js中没有调用page.原视频中是可以出来文本内容的. 但是把js调用page以后是可以呈现的 所以疑问点就是为什么以前可以? 1.微信开发工具改了,强制 ...

  3. 【java】ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

    如果是负载均衡,则 jdbc.url=jdbc:oracle:thin:@(description=(address_list= (address=(host=XX.XXX.X.XX) (protoc ...

  4. [冬令营Day1 T2]sequence

    题目描述 Description 给一个长度为N的序列以及Q的询问,每次两个参数l,r,问你序列[l,r]中的最大连续和 输入描述 Input Description 一行二个正整数N,Q. 接下来一 ...

  5. JS的ES7支持

    1.指数运算符(幂): ** 2.Array.prototype.includes(value) : 判断数组中是否包含指定value console.log(2**4); let arr = [2, ...

  6. Qt常用类——Qstring

    Qstring有一些方面跟C/C++中的string的使用,例如把一个字符串追加到另一个字符串中,也是用“+”.也有append函数等. 下面是是Qstring的一些常用的具体函数示例: Qt的QSt ...

  7. Kafka Rebalance机制分析

    什么是 Rebalance Rebalance 本质上是一种协议,规定了一个 Consumer Group 下的所有 consumer 如何达成一致,来分配订阅 Topic 的每个分区. 例如:某 G ...

  8. 复旦大学2018--2019学年第二学期高等代数II期末考试情况分析

    一.期末考试成绩班级前十名 丁思成(99).周烁星(97).王捷翔(96).顾文颢(92).顾天翊(90).封清(89).张思哲(89).李哲蔚(88).陈钦品(88).邹年轶(88).王祝斌(88) ...

  9. 微信小程序之简单记账本开发记录(七)

    记账本已经可以实现添加和删除的功能 现在只需要将上述步骤重复一遍便可将另一个界面做出来. 大体上已制作完成,如果在细节上有变动会在这一篇更新 总体来说,这个作业让我对微信小程序的开发有了更多地认识,大 ...

  10. 第01组 Alpha冲刺(4/6)

    队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11884375.html 作业博客: https://edu.cnblogs.com/campus/fz ...