//偽數組轉真數組
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);
//結果如下圖