JS中对象的深拷贝


ck_tools = {}

 

//伪数组转真数组
    ck_tools.ArrayLike = function(arrayLike){
        return Array.from ? Array.from(arrayLike) : Array.prototype.slice.call(arrayLike);
    }    

    //判断是否是数组
    ck_tools.isArray = function(arr){
        return Array.isArray ? Array.isArray(arr) : Object.prototype.toString.call(arr) == '[object Array]';
    };

/**
        判读是不是对象字面量(纯对象)。对象字面量创建方式有{}、new Object()创建  
    */
    ck_tools.isPlainObject = function(obj){
        var flag = false;
        if(!obj || typeof obj != 'object'){return flag;}
        if(ck_tools.isHasPro(obj.constructor.prototype,"isPrototypeOf")){
            flag = true;
        }
        return flag;
    }

//判读是否是自身属性
    ck_tools.isHasPro = function(obj,pro){
        return obj.hasOwnProperty(pro);  
    }

 

    //对象属性深拷贝
    ck_tools.extend = function(){
        //arguments不能在箭头函数中使用
        if(arguments.length <= 0){return};
        var _self = this
        ,args = ck_tools.ArrayLike(arguments)
        ,target = args[0];
        ck_tools.forEach(args,function(arg,i){
            if(i!=0){
                var keys = Object.keys(arg);
                ck_tools.forEach(keys,function(key,i){
                    var val = arg[key];
                    if(ck_tools.isPlainObject(val) || ck_tools.isArray(val)){
                        var newTarget = ck_tools.isArray(val)?[]:{};
                        //extend()返回给newTarget,再把newTarget值赋值给上一个目标对象 的key
                        if(!target[key]){
                            target[key] = _self.extend(newTarget,val);
                        }else{
                            _self.extend(target[key],val)
                        }
                    }else{
                        target[key] = val;
                    }
                });
            }
        });
        return target;
    }

 

//3、使用方法

var obj1 = {name:"ck",get:function(){alert("obj1的get()")}};
var obj2 = {age:18,arr:[1,2,3,[99,100]],p:{pc:"pc",ip:{ip:"ip",cpu:"cpu"}}}
var obj3 = ck_tools.extend({},obj1,obj2);

//结果如下图


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM