js的call和bind等原型方法的简单实现

看代码之前,你必须了解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]
  }
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值