Javascript对象拷贝(clone),希望大家给点建议
​1. [代码]方法代码

function cp(source, target) {
    function isBaseType(v) {
        var type = typeof v;
        var basetype = {
            "string": true,
            "number": true,
            "boolean": true,
            "function": true,
            "undefined": true
        };
        return basetype[type] || v === null;
    }
 
    function createClone(v) {
        var clone = [];
        if (!(v instanceof Array)) {
            clone = {};
        }
        return clone;
    }
 
    function createCloneFn(fn) {
        var fncode = fn.toString();
        var regex_params = /^function\s+?(\()([\s\S]*?)(\))/;
        var params = [];
        var params_index = 2;
        var result = fncode.match(regex_params);
        if (result) {
            var param_code = result[params_index];
            if (param_code) {
                params = param_code.split(",")
            }
        }       
        var fncode = fncode.replace(regex_params, "").replace(/^\s*?\{|\}\s*?$/g,"");
        fncode += " console.log('clone')";
        params.push(fncode);        
        return Function.apply(null, params); ;
    }http://www.huiyi8.com/guoqi/​
    function createVal(v)
    {国旗图标
        var val = v;
        if( typeof v =="function" )
        {   
            val = createCloneFn(v);
        }
        return val ;
    }
    if (source instanceof Function) {             
        target = createCloneFn(source);     
    } else if (source instanceof Array) {
        if (target instanceof Array) {
            var source_size = source.length;
            for (var index = 0; index < source_size; index++) {
                var item = source[index];
                if (!isBaseType(item)) {
                    var clone_array = createClone(item);
                    target.push(clone_array);
                    arguments.callee(item, clone_array);
                }
                //基础类型
                else {
                    target.push( createVal(item));
                }
            }
        } else {
            //console.log("数组拷贝不成立");
        }
    } else if (typeof source == "object") {
        if (!isBaseType(target))
            for (var attrname in source) {
                var val = source[attrname];
                //是否为基础类型
                if (!isBaseType(val)) {
                    var clone_obj = createClone(val);
                    target[attrname] = clone_obj;
                    arguments.callee(val, clone_obj);
                } else {
                    target[attrname] = createVal(val);
                }
            }
    } 
    return target;
}
2. [代码]测试代码     
var target = [];
var source = [
    [{
        a: {
            "show": function() {
                alert(1)
            }
        }
    }]
];
  target =cp(source, target);

Javascript对象拷贝(clone)的更多相关文章

  1. 也说Javascript对象拷贝及疑问

    一.浅拷贝 当我们需要将一个对象拷贝至另一个对象时,我们一般会这么实现 function shadowCopy(source,target){ var target=target||{}; for(v ...

  2. JavaScript 对象拷贝研究

    介绍一下JavaScript里面的一些对象拷贝的方法 浅拷贝 深拷贝 利用序列化进行对象拷贝

  3. [javascript] 对象拷贝

    Object.prototype.clone = function() { var copy = (this instanceof Array) ? [] : {}; for (attr in thi ...

  4. javascript对象拷贝

    浅拷贝 浅拷贝函数: function copy(p){ var c = {}; for (var i in p){ c[i] = p[i]; } c.uber = p; return c; } 测试 ...

  5. javascript对象深拷贝,浅拷贝 ,支持数组

    javascript对象深拷贝,浅拷贝 ,支持数组 经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One meth ...

  6. javascript中的对象拷贝

    js中的数据类型 在介绍javascript中的对象的拷贝之前,我先介绍一个基础的东西,javascript中的数据类型. 我们做前端的应该都知到在es6 之前,javascript中的数据类型Boo ...

  7. 也来玩玩 javascript对象深拷贝,浅拷贝

    经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...

  8. es6 javascript对象方法Object.assign()

    es6 javascript对象方法Object.assign() 2016年12月01日 16:42:34 阅读数:38583 1  基本用法 Object.assign方法用于对象的合并,将源对象 ...

  9. JavaScript 对象继承 OOP (三)

      对象继承 A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. JavaScript 语言的继承不通过 class (es6 中的class 不过是 ...

随机推荐

  1. 【Educational Codeforces Round 49 (Rated for Div. 2) 】

    A:https://www.cnblogs.com/myx12345/p/9843826.html B:https://www.cnblogs.com/myx12345/p/9843869.html ...

  2. npm start 修改启动端口的不同方式

    antd的启动配置文件基于package.json文件,配合roadhog使用时,启动配置是: "scripts": { "start": "road ...

  3. Codeforces 833B The Bakery(主席树 + 决策单调性优化DP)

    题目链接 The Bakery 题目大意:目标是把$n$个数分成$k$组,每个组的值为这个组内不同的数的个数,求$k$个组的值的和的最大值. 题目分析: 这道题我的解法可能和大众解法不太一样……我用主 ...

  4. css3的一些新属性及部分用法

    CSS3是CSS(层叠样式表)技术的升级版本,增加了很多新属性,我们在web开发中采用css3技术可以提高程序的性能以及用户体验.而且一般面试中会问到知道哪些新增加的属性,我们不可能将所有东西一一复述 ...

  5. 读取编码器信息Python2.7和Python3.3版本差异及解决,一次订阅多次调用callback的解决

    1. Python3.3以字节类型返回编码器信息,b'...',BUF: b'\xc3KOO\x00OO\x00OO\x00OO\x00OO\x00\x03\x00\x00\x00\x00\x99R\ ...

  6. MongoDB学习day10--Mongoose的populate实现关联查询

    一.Mongoose populate官方文档 https://mongoosejs.com/docs/populate.html 二.Mongoose populate关联查询 1.定义ref va ...

  7. widows 2008 同步时间命令

    由于windows2008没有提供类似XP的自动同步功能,因此需要使用windows 2008计划任务来运行一行命令进行同步.   首先查看与想要同步时间的internet时间服务器的时差: w32t ...

  8. MySQL---笔记之视图的使用详解

    什么是视图  视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据. 这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据. ...

  9. HDU 2845 Beans (两次线性dp)

    Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  10. shell 检查文件夹所属用户组

    shell 检查文件夹所属用户组 #!/bin/bash # 检查文件夹 权限是否777 检查文件夹所属组是否www # authro ranmufei # 2017 08 21 云板容器版 /dat ...