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. PHP实现当前文件夹下所有文件和文件夹的遍历

    <?php function myScandir($dir){ static $flag=''; //设置缩进显示格式 $files = scandir($dir);//读取当前文件夹的文件 $ ...

  2. elasticsearch入门使用(三) Query DSL

    Elasticsearch Reference [6.2] » Query DSL 参考官方文档 :https://www.elastic.co/guide/en/elasticsearch/refe ...

  3. stm32的IIc总线--超声波测距

  4. Centos常用命名

    1.关机 (系统的关机.重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours: ...

  5. vSphere 6.5 新功能 (7) - 支持 512e 硬盘

    2016-12-11 Newton 长期以来,机械硬盘在储存数据时,一直都是以 512 byte 大小的扇区(Sector)为单位分割进行读写.随着硬盘容量的不断提升,这种古老的分配标准已经越来越不合 ...

  6. 关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)

    原文:http://www.open-open.com/code/view/1446195787257 package cn.outofmemory.codes.Date; import java.u ...

  7. Linux中修改docker镜像源及安装docker

    1.首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.re ...

  8. [CSS3] Identify Interactive HTML Elements with CSS Link Pseudo Classes

    The interactive pseudo-classes for links (and buttons) allow us to make sure the user knows what ele ...

  9. 出现异常时直接把e输出比输出e.getMessage()好得多

    之前研究态度不好,出异常时处理草草了事,今天出现问题才觉得该认真对待每个分支.

  10. 【转】DevOps原则

    DevOps的出现有其必然性.在软件开发生命周期中,遇到了两次瓶颈. 第一次瓶颈是在需求阶段和开发阶段之间,针对不断变化的需求,对软件开发者提出了高要求,后来出现了敏捷方法论,强调适应需求.快速迭代. ...