JavaScript中关于手写一个bind方法的疑问?

先附上一段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;
  };
}

这几天在研究关于手写的一些问题,但因为基础不太扎实,对于有些东西一知半解,会转不过弯来。
上述代码中,被我用注释框起来的部分,也就是源代码标注了【维护原型关系】的部分,翻了一些同学写的文章,尽力了,但仍然无法理解这一段的作用以及原因,有无同学可以详细解释下,帮我读懂这里呢,感激不尽了

阅读 1.5k
1 个回答

就是把要绑定的函数的原型链copy过来,差不多是这意思。比如外部的函数function fn(){};它可能有绑定一些原型上的函数属性:fn.prototype.log = funtion() {};那么需要把这个原型对象给搬过来或者复制过来。其实也没必要这么麻烦,我看了下MDN上提供的polyfill并没有这么复杂的说。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏