JS中对象的深拷贝

眉间皱痕 提交于 2019-12-05 00:06:21
ck_tools = {}

/**
 * 第一步:公用方法
 *
 */

//伪数组转真数组
ck_tools.fArrToTArr = function(fArr){
    if(ck_tools.isFunction(Array.from)){
        return Array.from(fArr);//[...fArr]
    }else{
        return Array.prototype.slice.call(fArr);
    }
}

/**
 * 判读是不是对象字面量(纯对象)。对象字面量创建方式有{}、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.isArray = function(arr){
    if(ck_tools.isFunction(Array.isArray)){
        return Array.isArray(arr);
    }else{
        return Object.prototype.toString.call(arr) == '[object Array]';
    }
};
//对象属性深拷贝
    ck_tools.extend = function(){
        //arguments不能在箭头函数中使用
        if(arguments.length <= 0){return};
        var _self = this
        ,args = ck_tools.fArrToTArr(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
                        target[key] = _self.extend(newTarget,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);//结果如下图

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!