正在加载中

最后更新于 2019年05月20日

深度克隆主要用于引用类型,因为大部分的引用类型如果某一个实例进行了修改,那么其他同一个引用的实例对象也会发生改变。

经过我小段时间的研究,以我目前的了解的来说,方法是没办法完全克隆的,你最多拿到独立属性,原型是共享的,这个没办法克隆,所以有点无解的样子,感觉这个深度克隆也只是表面意义上的克隆。

因为不是很懂啊,所以暂时先丢出写的方法吧,等待以后有机会更深入了解再详细说明,主要是我百度到的都是es6标准的一个方法,有些属性我并不了解,不知道他们的实际意义是什么。所以,很无奈啊!

function say() {
    console.log('hi');
}
function person(name) {
    this.name = name;
}
person.prototype.run = function() {
    console.log(this.name);
}
var Messi = new person('Messi');

var box = {
    a : new Date(),
    b : new RegExp('le','ig'),
    c : [1,2,3],
    d : say,
    e : Messi,
    f : 'name'
}
var da = 'name';

var pox = copy(box);

function copy(data){
    var type = Object.prototype.toString.call(data).slice(8,-1);
    if(type == 'Object') {
        if(typeof data.prototype == 'undefined') {
            var elem = {};
            for(var i in data) {
                elem[i] = copys(data[i]);
            }
            return elem;
        }else {
            function F() {};
            for(var i in data) {
                elem[i] = copys(data[i]);
            }
            F.prototype = new data();
            return new F();
        }
    }else {
        return copys(data);
    }
}

function copys(data) {
    var type = Object.prototype.toString.call(data).slice(8,-1);
    var al  = null;
    switch(type) {
        case 'Date' :
            al = new Date(data.getTime())
            return al;
        case 'RegExp' : 
            al = copyRegExp(data);
            return al;
        case 'Array' : 
            al = copyArray(data);
            return al;
        case 'Function' : 
            al = data;
            return al;
        case 'Object' : 
            al = copy(data);
            return al;
        default : 
            al = data;
            return al;
    }
    
    
    function copyRegExp(reg) {
        var mod = '';
        if(reg.global) mod += 'g';
        if(reg.ignoreCase) mod += 'i';
        if(reg.multiline) mod += 'm';
        return new RegExp(reg.source,mod);
    }
    function copyArray(array) {
        var arr = [];
        for(var i in array) {
            arr[i] = array[i];
        }
        return arr;
    }
}
  • weixiao kaixin tushetou jingkong deyi fanu liezui liuhan daku ganga bishi nanguo lihai qian yiwen numu tu yi haixiu se fadai minyan hehe henkaixin huaji biyiyan kuanghan maimeng shui xiaku penqi zhangzui pen aini ye niu laji ok chigua renshi kongbu shuai xiaoxiese touxiao huaixiao jingnu chihuai kaisang xiaoku koubi zhuangbi lianhong kanbujian shafa zhijing xiangjiao dabian yaowan redjing lazhu rizhi duocang chixigua hejiu xixi xiaopen goukun xiaobuchu shenme wusuowei guancha lajing chouyan xiaochi bie zhadanzui zhadanxiao