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