先附上一段MDN提供的方案
if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== 'function') {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
}
var aArgs = Array.prototype.slice.call(arguments, 1),//这里的arguments是跟oThis一起传进来的实参
fToBind = this,
fNOP = function() {},
fBound = function() {
return fToBind.apply(this instanceof fNOP
? this
: oThis,
// 获取调用时(fBound)的传参.bind 返回的函数入参往往是这么传递的
aArgs.concat(Array.prototype.slice.call(arguments)));
};
//-------------------------------------------------
// 维护原型关系
if (this.prototype) {
// Function.prototype doesn't have a prototype property
fNOP.prototype = this.prototype;
}
fBound.prototype = new fNOP();
//-------------------------------------------------
return fBound;
};
}
这几天在研究关于手写的一些问题,但因为基础不太扎实,对于有些东西一知半解,会转不过弯来。
上述代码中,被我用注释框起来的部分,也就是源代码标注了【维护原型关系】的部分,翻了一些同学写的文章,尽力了,但仍然无法理解这一段的作用以及原因,有无同学可以详细解释下,帮我读懂这里呢,感激不尽了
就是把要绑定的函数的原型链copy过来,差不多是这意思。比如外部的函数function fn(){};它可能有绑定一些原型上的函数属性:fn.prototype.log = funtion() {};那么需要把这个原型对象给搬过来或者复制过来。其实也没必要这么麻烦,我看了下MDN上提供的polyfill并没有这么复杂的说。