看代码之前,你必须了解this动态绑定特性
Function.prototype.bindN = function(context){ var self = this; return function(){ context.fn = self; context.fn(); delete context.fn; } } Function.prototype.callN = function(context){ var self = this; context.fn = self; context.fn(); delete context.fn; } var obj = { birth:100, fun:function(){ return function(){ console.log(this.birth); }.bindN(obj) } } obj.fun()() // console.log(obj) /*使用callN*/ var obj2 = { birth:0, fun:function(){ return function(){ console.log(this.birth); } } } obj2.fun().call(obj2) //现在综合一下 obj.fun().call(obj2)//猜猜怎么执行的 相当于obj2.obj.fun()();//可能不准确,但抛出砖头了就好下面是一个数组的深度拷贝(没有测试太多栗子),采用递归处理
var arr = [ {age:5,name:"mark"}, [[1,2,3],4,5] ]; //数组拷贝方法 function arrayCopy(arr_src,arr_dst=[]){ //第二个参数可选 for(var i=0;i<arr_src.length;i++){ if(arr_src[i] instanceof Array){ arr_dst[i] = arrayCopy(arr_src[i]); }else if(arr_src[i] instanceof Object){ arr_dst[i] = objCopy(arr_src[i]) }else { arr_dst[i] = arr_src[i]; } } return arr_dst; } //对象(json)拷贝方法 function objCopy(obj_src,obj_dst={}){ //第二个参数可选 for(var i in obj_src){ if(obj_src[i] instanceof Array){ obj_dst[i] = arrayCopy(obj_src[i]); }else if(obj_src[i] instanceof Object){ obj_dst[i] = objCopy(obj_src[i]) }else{ obj_dst[i] = obj_src[i]; } } return obj_dst; } var newArr = arrayCopy(arr); // console.log(newArr) ///最终目的是达到修改新数组,原数组不受影响 newArr[0].age=100; newArr[1][0] = 1; console.log(newArr) console.log(arr)上述栗子的简化版
function objCopy(obj_src,obj_dst={}){ //第二个参数可选 for(var i in obj_src){ if(obj_src[i] instanceof Object){ obj_dst[i] = objCopy(obj_src[i]) }else{ obj_dst[i] = obj_src[i]; } } return obj_dst; }Array的原型方法splice的实现
Array.prototype.spliceN = function(location,count = 0,args){ var self = this; //不计算locatio和count的数量 var argsLen = arguments.length-2; //用于判断是否找到了位置 var bFlag = false; var i;//循环变量 /**********删除操作*********/ for(i = 0; i < self.length; i++){ if(i == location){ bFlag = true; } if(bFlag){ // self[i+count]? self[i] = self[i+count]:delete self[i]; self[i] = self[i+count]; } } /**********数组长度手动修改*********/ self.length -= count // console.log(self.length) /**********插入操作(分两步)*********/ /***********给新数据腾出空间**********/ for(i = (self.length += argsLen)-1;i>=location;i--){ self[i] = self[i-argsLen]; } /**********把参数添加进相应位置*********/ for(i = 0;i<argsLen;i++){ self[location+i] = arguments[i+2] } }