js实现bind函数

乞丐版

基本原理使用apply模拟bind,函数体内的this就是原函数,使用apply进行参数content绑定、将参数第一个以外的作为提供给原函数的预设参数。

Function.prototype.bind=function(content){
  var me=this
  var arrayList=Array.prototype.slice.call(arguments)
  return funtion(){
    return me.apply(content,arrayList.slice(1))
  }
}

升级版

在返回的绑定函数中实现预设参数

Function.prototype.bind=function(content){
  if(typeof this!=='function'){
    throw new TypeError('this is no function')
 }
  var me=this
   var args=Array.prototype.slice.call(arguments,1)
   return function(){
     var interArgs==Array.prototype.slice.call(arguments)
     args=args.concat(interArgs)
     return me.apply(content,args)
   }
}

plus版

继续探究中,在bind方法中,bind返回的函数如果作为构造函数搭配new关键字出现,则绑定的this需要被忽略,this要绑定在实例上。也就是说new关键字的优先级高于bind绑定。兼容这种情况下实现如下

Function.prototype.bind=function(content){
  if(typeof this!=='function'){
    throw new TypeError('this is no function')
  }
  var me=this
  var args=Array.prototype.slice.call(arguments,1)
  var F=function(){}
  F.prototype=this.prototype
  var bound=function(){
    var interArgs=Array.prototype.slice.call(arguments)
    args=args.concat(interArgs)
    return me.apply(this instanceof F?this:content,args)
  }
  bound.prototype=new F()
  return bound
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值