我们知道,在js中,当object作为参数传递到函数中进行处理后,实际上是修改了传入的对象本身(或者说是对象的引用),但很多时候我们并不希望函数去修改我们的这些对象参数,这就需要使用到对象的克隆,我们应该对该对象做一个克隆,然后操作这个克隆的对象,这样就不会影响我们的原对象了。
    不过在js中并没有对象克隆功能,因此需要我们自己实现,实现方法也不复杂其实,基本上是做一些属性复制,我在网上找了一些,但有些实现并不好,如对于array对象克隆后就成json对象了,并没有保留原来的数组方式。不过最后还是找到了一个很好的克隆函数,完美实现了js对象的克隆功能,不论是Array对象或者是普通的Object,都可以很好的进行克隆,这个函数使用constructor(函数构造器)进行复制。

具体代码如下:

Object.prototype.Clone = function(){
    var objClone;
    if (this.constructor == Object){
        objClone = new this.constructor(); 
    }else{
        objClone = new this.constructor(this.valueOf()); 
    }
    for(var key in this){
        if ( objClone[key] != this[key] ){ 
            if ( typeof(this[key]) == 'object' ){ 
                objClone[key] = this[key].Clone();
            }else{
                objClone[key] = this[key];
            }
        }
    }
    objClone.toString = this.toString;
    objClone.valueOf = this.valueOf;
    return objClone; 

js实现对象完美克隆相关推荐

  1. JS篇之数组、对象的克隆

    1. 数组的克隆 一. 普通一维数组深克隆let arr = [1,2,3](1) for循环遍历数组pushlet arr1 = []for( let i of arr ){arr1.push(i) ...

  2. Javascript中的对象拷贝(对象复制/克隆)

    Javascript中的对象拷贝(对象复制/克隆) 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 1. 对象的引用 要说"拷贝"还要先说"引 ...

  3. JS:对象的浅克隆、深克隆

    JS中对象的深浅克隆 一.对象的浅克隆 1.浅克隆:只克隆对象的"表层",如果对象的某些属性值又是引用类型值,则不进一步克隆它们,只是传递它们的引用 2.使用for-in-循环即可 ...

  4. js原型对象的深拷贝

    第一次写博客有什么问题可以互相讨论哈 我们都知道在js中对象的传值是地址传值,而我们在拷贝对象的时候需要注意的是如果对象中的属性值是对象,那么我们的思路应该是这样子的: 1.第一步,因为对象中的属性也 ...

  5. js空对象undefined

    <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>js空 ...

  6. js空对象undefined测试

    代码示例: <!DOCTYPE html> <html><head><meta charset="UTF-8"><title& ...

  7. Node.js 全局对象

    Node.js 全局对象 在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 gl ...

  8. 分支结构||分支循环结构||使用原生js遍历对象

    分支循环结构 分支结构 v-show的原理:控制元素样式是否显示 display:none <!DOCTYPE html> <html lang="en"> ...

  9. 对象的内置属性和js的对象之父Object()

    js中对象有constructor,valueOf(),toString()等内置属性和方法; 创建一个空对象的方法: var o = {}; 或者 var o= new Object(); o.co ...

最新文章

  1. ASP.NETCore学习记录(一)
  2. 设计模式(十五):Iterator迭代器模式 -- 行为型模式
  3. AI赌神超进化:德扑六人局击溃世界冠军,诈唬如神,每小时能赢1千刀 | Science...
  4. ansible自动化部署(一)
  5. 交换机端口故障问题解决方法
  6. 简单 局部 整体光照模型计算机图形学,计算机图形学北大光照模型.ppt
  7. PTA12、 统计文字中的单词数量并按出现次数排序 (10 分)
  8. 服务器与HTML客户端通信,服务器与HTML客户端通信
  9. 中国顶级AI盛会,10月魔都等你来解密!
  10. 书单 | 读了这10本书,再也不怕黑客攻击了
  11. 自动化测试 短信验证登录
  12. C语言中更改用户名,如何更改C:User/Administrator这个文件夹的名字
  13. illegal instruction问题窥探
  14. 10015---JavaScript--表单验证
  15. 6种继承的优点和缺点
  16. 沙特罚金减免期从2022年6月1日到11月30日-跨境知道
  17. 安卓逆向系列教程 4.2 分析锁机软件
  18. USB 的UVC协议分析
  19. xp系统网上邻居看不到局域网电脑_网上邻居看不到局域网的其它计算机名
  20. HDU 2370 Convert Kilometers to Miles

热门文章

  1. we are the world 群星,
  2. android 一些常用的功能方法代码块
  3. JQuery绑定事件 时如何传递参数
  4. nyoj 1216 整理图书(dp)
  5. NYOJ 79 拦截导弹
  6. NYOJ 559 报数游戏
  7. CodeForce 237C Primes on Interval(二分+ 素数筛法)
  8. NYOJ 608 畅通工程 并查集
  9. VUE+SpringBoot+JWT实现token验证,SSO单点登录
  10. Android 计算Bitmap大小