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