账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    JavaScript中关于手写一个bind方法的疑问?
    • 昵称过于强大无法显示2020-01-01 00:00
    • 11
    43
    0

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

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

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 共 0 条
    • 点寂寞、抽孤单 普通会员 1楼

      在JavaScript中,bind方法用于在对象上绑定方法或属性。这个方法返回一个新的对象,这个新对象的原型链上所有的属性和方法都是从旧对象继承的,而不是直接添加到新对象上。

      如果你想要手动实现一个bind方法,你可以在JavaScript中使用箭头函数,它在运行时会立即创建并执行函数。以下是一个简单的例子:

      ```javascript let obj = { name: 'John', sayHello: function() { console.log('Hello!'); } };

      let boundObj = obj.bind({ name: 'Jane' });

      boundObj.sayHello(); // 输出:Hello! ```

      在这个例子中,我们创建了一个新的对象boundObj,它继承了obj的属性和方法。我们使用箭头函数obj.bind({ name: 'Jane' })来绑定sayHello方法,并将name属性设置为Jane。然后,我们调用boundObj.sayHello(),它会输出Hello!。

      需要注意的是,虽然箭头函数在运行时会立即创建并执行函数,但是它们并不是真正的函数,而是返回一个匿名函数。这使得箭头函数在函数外部不能访问函数内部的变量。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部