在js中的深复制完成要领

针对本话题,我在2015年5月宣布了新的文章:深切理会 JavaScript 的深复制

要完成深复制有许多要领,比方最简朴的要领有:

var cloneObj = JSON.parse(JSON.stringify(obj));

上面这类要领优点是异常简朴易用,然则害处也不言而喻,这会扬弃对象的constructor,也就是深复制以后,不管这个对象底本的组织函数是什么,在深复制以后都邑变成Object。别的诸如RegExp对象是没法经由历程这类体式格局深复制的。

所以这里我将引见一种,我自认为很幽美的深复制要领,固然能够也存在题目。假如你发现了我的完成要领有什么题目,请实时让我晓得~

先决条件:
1. 关于任何对象,它能够的范例有Boolean, Number, Date, String, RegExp, Array 以及 Object(一切自定义的对象全都继续于Object
2. 我们必需保存对象的组织函数信息(从而使新对象能够运用定义在prototype上的函数)

最重要的一个函数:

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;
};

定义在Object.prototype上的clone()函数是全部要领的中心,关于恣意一个非js预定义的对象,都邑挪用这个函数。而关于一切js预定义的对象,如Number,Array等,我们就要完成一个辅佐clone()函数来完成完全的克隆历程:

/* Method of Array*/
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;
};

/* Method of Boolean, Number, String*/
Boolean.prototype.clone = function() { return this.valueOf(); };
Number.prototype.clone = function() { return this.valueOf(); };
String.prototype.clone = function() { return this.valueOf(); };

/* Method of Date*/
Date.prototype.clone = function() { return new Date(this.valueOf()); };

/* Method of RegExp*/
RegExp.prototype.clone = function() {
    var pattern = this.valueOf();
    var flags = '';
    flags += pattern.global ? 'g' : '';
    flags += pattern.ignoreCase ? 'i' : '';
    flags += pattern.multiline ? 'm' : '';
    return new RegExp(pattern.source, flags);
};

能够直接定义在预定义对象的要领上,让人觉得会有些题目。但在我看来这是一种幽美的完成体式格局。

同时我也在开辟一个插件,重要的头脑也就是扩大预定义对象的要领。
这个插件叫JustJSGithub项目地点
有以下一些特征:
1. 同时支撑Web前端和node.js运用。
2. 直接对预定义对象的要领举行扩大
3. 运用 J(function(){...}) 语句块,决不污染全局定名空间。
现在只写了一小部分,同时也写了些简朴的文档,有兴致的同砚能够看一下,也能够到场我,Fork我的项目,喜好的同砚还能够给Star

    原文作者:JerryZou
    原文地址: https://segmentfault.com/a/1190000000501320
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞