JavaScript function.prototype.bind polyfill

时间:2016-12-28 15:23:50

标签: javascript bind instanceof polyfills

为什么我们需要在这里使用instanceOf,在这种情况下结果是真的?

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),
        fToBind = this,
        fNOP    = function() {},
        fBound  = function() {
          return fToBind.apply(this instanceof fNOP
                 ? this
                 : oThis,
                 aArgs.concat(Array.prototype.slice.call(arguments)));

//为什么我们需要在这里使用instanceOf             };

    if (this.prototype) {
      // Function.prototype doesn't have a prototype property
      fNOP.prototype = this.prototype; 
    }
    fBound.prototype = new fNOP();

    return fBound;
  };
}

//哪种情况结果为真?

1 个答案:

答案 0 :(得分:1)

我认为这与下面的问题重复,除了变量在2011年被问到时其命名略有不同之外,因此很容易注意到它:

mozilla's bind function question

请参阅该问题以获取完整的说明(如果您同意该答案,则可以回答该问题),但是关键是:

  

它允许您将绑定函数作为构造函数调用而不必绑定到原始对象。换句话说,如果您使用new进行调用,则“绑定”功能仍将像原始的未绑定版本一样工作。