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);
//結果如下圖
