• 用call/apply实现bind


    实现代码如下:

    /* 用call/apply实现bind */
    Function.prototype.myBind = function (obj) {
      // const temp = Array.prototype.slice.call(arguments, 1);
      const temp = [...arguments].slice(1);
      const self = this; // 须先保存this,否则调用myBind时,下面这个内层函数中的this指向window
      return function () {
        // return self.call(obj, ...temp, ...arguments);
        return self.apply(obj, temp.concat([...arguments]));
      };
    };
    /*************** 以下是实例,验证myBind是否正确 ***************/
    const obj = {
      name: "obj",
      fn: function () {
        console.log(this.name, ...arguments);
      },
    };
    const obj2 = {
      name: "obj2",
    };
    obj.fn.bind(obj2, 18)(19); // obj2 18 19
    obj.fn.myBind(obj2, 18)(19); // obj2 18 19

    注意:

    在外层函数中,arguments包含了第一个参数obj,需要去除,而arguments只是一个有length属性的伪数组,并没有slice方法,所以用call/apply的方法让arguments可以调用slice(1)截取需要的部分,并返回一个数组;也可以用解构赋值的方式解构出一个新数组再调用slice方法
     
     
  • 相关阅读:
    构造方法调用另一个构造方法,用this
    排块游戏
    阶乘 大数存储
    Circle
    Git简单入门教程
    Python爬虫第一个成功版
    Python爬虫入门
    js中去除字符串两边的空格
    UUID生成字符串
    连接数据库工具类DBUtil
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/15463915.html
Copyright © 2020-2023  润新知