乞丐版
基本原理使用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
}