You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Function.prototype.bind2=function(context){varself=this;varargs=Array.prototype.slice.call(arguments,1);varfNOP=function(){};varfBound=function(){varbindArgs=Array.prototype.slice.call(arguments);returnself.apply(thisinstanceoffNOP ? this : context,args.concat(bindArgs));}fNOP.prototype=this.prototype;fBound.prototype=newfNOP();returnfBound;}
异常处理
到这里其实已经差不多了,但有一个问题是调用 bind 的不是函数,这时候需要抛出异常。
if (typeof this !== "function") {
throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
}
所以完整版模拟实现代码如下:
Function.prototype.bind2=function(context){if(typeofthis!=="function"){thrownewError("Function.prototype.bind - what is trying to be bound is not callable");}varself=this;varargs=Array.prototype.slice.call(arguments,1);varfNOP=function(){};varfBound=function(){varbindArgs=Array.prototype.slice.call(arguments);returnself.apply(thisinstanceoffNOP ? this : context,args.concat(bindArgs));}fNOP.prototype=this.prototype;fBound.prototype=newfNOP();returnfBound;}
The text was updated successfully, but these errors were encountered:
参考
bind
一句话介绍 bind:
由此我们可以首先得出 bind 函数的两个特点:
返回函数的模拟实现
从第一个特点开始,我们举个例子:
模拟实现第一步(指定this,返回函数)
对于第 1 点,使用 call / apply 指定 this 。
对于第 2 点,使用 return 返回一个函数。
之所以 return self.apply(context),是考虑到绑定函数可能是有返回值的,依然是这个例子
模拟实现第二步(传参数的模拟实现)
对于第3点,可以传入参数,使用 arguments 获取参数数组并作为 self.apply() 的第二个参数,实现参数传递的功能。
模拟实现第三步(构造函数效果的模拟实现)
到现在已经完成大部分了,但是还有一个难点,bind 有以下一个特性
也就是说当 bind 返回的函数作为构造函数的时候,bind 时指定的 this 值会失效,但传入的参数依然生效。举个例子:
上面例子中,运行结果this.value 输出为 undefined,这不是全局value 也不是foo对象中的value,这说明 bind 的 this 对象失效了,new 的实现中生成一个新的对象,这个时候的 this指向的是 obj。
所以我们可以通过修改返回的函数的原型来实现,让我们写一下:
构造函数效果的优化实现
但是在这个写法中,我们直接将 fBound.prototype = this.prototype,我们直接修改 fBound.prototype 的时候,也会直接修改绑定函数的 prototype。这个时候,我们可以通过一个空函数来进行中转:
异常处理
到这里其实已经差不多了,但有一个问题是调用 bind 的不是函数,这时候需要抛出异常。
所以完整版模拟实现代码如下:
The text was updated successfully, but these errors were encountered: