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);//结果如下图
