博客
关于我
JS 深拷贝
阅读量:796 次
发布时间:2023-03-24

本文共 1718 字,大约阅读时间需要 5 分钟。

深复制是一个非常有用的操作,常用于需要创建对象副本的情况。在 JavaScript 中,实现深复制的方法有很多种,其中最简单的方法是使用 JSON.parse(JSON.stringify(obj))。这种方法简单易用,但也有明显的缺点:它会抛弃对象的构造函数信息,即深复制后的对象不会保留原对象的 constructor,这可能会导致一些问题。例如,对于自定义对象或需要保留原构造函数信息的对象,这种方法并不适用。此外,某些对象如 RegExp 是无法通过这种方式深复制的。

为了解决这些问题,我设计了一种深复制方法,旨在既保持代码的简洁性,又能完整地复制对象,包括其构造函数信息。这种方法的核心在于定义一个 clone 方法,供所有对象使用,同时为一些预定义的对象(如 Array)提供专门的辅助方法。

深复制的实现方法

首先,我们定义一个通用的 clone 方法,适用于大多数对象:

Object.prototype.clone = function () {
var Constructor = this.constructor;
var obj = new Constructor();
for (var attr in this) {
if (this.hasOwnProperty(attr)) {
if (typeof(this[attr]) !== "function") {
if (this[attr] === null) {
obj[attr] = null;
} else {
obj[attr] = this[attr].clone();
}
}
}
}
return obj;
};

这个方法的思路是:首先获取对象的构造函数,创建一个新对象,然后通过遍历原对象的属性,逐一复制到新对象中。需要注意的是,对于属性值为函数的属性,我们不进行深复制,因为函数的引用会被保留。

接下来,我们需要为一些预定义的对象(如 Array)提供专门的 clone 方法,确保它们能够正确使用通用的 clone 方法:

Array.prototype.clone = function () {
var thisArr = this.valueOf();
var newArr = [];
for (var i = 0; i < thisArr.length; i++) {
newArr.push(thisArr[i].clone());
}
return newArr;
};

注意事项

  • 对于 Date 对象,直接调用 clone 方法会返回一个新的 Date 实例,时间点与原对象一致。
  • 对于 RegExp 对象,需要使用 String.prototype.split 或其他方法来复制,因为 RegExpclone 方法无法直接使用。
  • 示例

    var obj = {
    a: 1,
    b: [2, 3],
    c: new Date(2024, 0, 1),
    d: /123/
    };
    var cloneObj = obj.clone();
    console.log(cloneObj.a); // 1
    console.log(cloneObj.b[0]); // 2
    console.log(cloneObj.c.toString()); // "2024-01-01T00:00:00.000Z"
    console.log(cloneObj.d.toString()); // "/123/"

    通过以上方法,我们可以实现对各种对象的深复制,包括自定义对象和预定义对象。这种方法既保持了代码的简洁性,又确保了对象的构造函数信息和属性的完整性。

    转载地址:http://dgqfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现图的邻接矩阵(附完整源码)
    查看>>
    Objective-C实现圆球的表面积和体积(附完整源码)
    查看>>
    Objective-C实现在Regex的帮助下检查字谜算法(附完整源码)
    查看>>
    Objective-C实现均值滤波(附完整源码)
    查看>>
    Objective-C实现埃拉托斯特尼筛法算法(附完整源码)
    查看>>
    Objective-C实现域名解析(附完整源码)
    查看>>
    Objective-C实现域名转IP(附完整源码)
    查看>>
    Objective-C实现培根密码算法(附完整源码)
    查看>>
    Objective-C实现基于 LIFO的堆栈算法(附完整源码)
    查看>>
    Objective-C实现基于 LinkedList 的添加两个数字的解决方案算法(附完整源码)
    查看>>
    Objective-C实现基于opencv的抖动算法(附完整源码)
    查看>>
    Objective-C实现基于事件对象实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于信号实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于文件流拷贝文件(附完整源码)
    查看>>
    Objective-C实现基于模板的双向链表(附完整源码)
    查看>>
    Objective-C实现基于模板的顺序表(附完整源码)
    查看>>
    Objective-C实现基本二叉树算法(附完整源码)
    查看>>
    Objective-C实现堆排序(附完整源码)
    查看>>
    Objective-C实现填充环形矩阵(附完整源码)
    查看>>
    Objective-C实现声音录制播放程序(附完整源码)
    查看>>