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