JavaScript 深克隆

        /**
         * 方法一 在Object.prototype中添加clone();
         */
        Object.prototype.clone = function () {
            var o = this instanceof Array ? [] : {};
            for (var attr in this) {
                if (typeof this[attr] == "object") {
                    o[attr] = this[attr].clone();
                    continue;
                }
                o[attr] = this[attr]
            }
            return o;
        };
        /*
            test
           ----------------------------------------------------------
         */
        var obj = {
            a: 3,
            b: "p",
            c: false,
            d: function (e) {
                console.log(e);
            },
            e:undefined,
            arr: [1, 3, {
                a: 1,
                b: "2",
                arr: [1, , 3]
            }]
        };
        var object = obj.clone();
        object.arr[2].arr[0] = 4;
        console.log(obj.arr[2].arr[0]);
        console.dir(object)
        console.log(JSON.stringify(obj));
        console.log(JSON.stringify(object));

    /**
     * 或者定义一个copy();
     * 事实证明 JavaScript的类型自动转换能力真的很强将所有基本类型都包装了 instanceof Object is true (坑爹).
     */

    function copy(obj) {
        if (!(obj instanceof Object)){
            return obj;
        }
        var o = obj instanceof Array ? [] : {};
        for (var attr in obj) {
            if (typeof obj[attr] == "object") {
                o[attr] = copy(obj[attr]);
            } else {
                o[attr] = obj[attr];
            }
        }
        return o;
    }
    /*
        test
     ----------------------------------------------------------
     */
    var obj = {
        a: 3,
        b: "p",
        c: false,
        d: function (e) {
            console.log(e);
        },
        arr: [1, 3, {
            a: 1,
            b: "2",
            arr: [1, 2, 3, {
                a: "c",
                arr: ["8", 1],
            }]
        }]
    };
    console.log(copy(4));
    var o = copy(obj);
    o.arr[2].arr[2] = 4;
    console.log(JSON.stringify(obj));
    console.log(JSON.stringify(o));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在复习,发现前端好多知识点牵一发动全身。比如我想看一下JQuery的extend源码,就不得不再好好看看深克隆...
    二璇妹妹阅读 1,605评论 2 9
  • 浅复制 只是复制了引用,复制前后都指向同一个对象,彼此之间会相互影响 深复制 在堆中重新分配内存,复制前后指向不同...
    07120665a058阅读 225评论 0 3
  • 因为近日的项目需要用到对数组做深克隆,所以做一个简要介绍与总结。 一开始听说这个概念的时候吓一跳,觉得高深莫测,有...
    FJW135阅读 695评论 0 1
  • // ----------1、直接复制对象 ----------- // -------...
    hao小子阅读 370评论 0 0
  • 说克隆之前,首先要说一下,js的数据类型 js中的数据类型分为两大类:原始类型和对象类型。 1)原始类型包括:数值...
    你期待的花开阅读 285评论 1 4