zoukankan      html  css  js  c++  java
  • 用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方法
     
     
  • 相关阅读:
    SVN资料库转移-----dump和load
    windows Server 2003修改远程连接限制
    oracle定时任务
    Oacle常用语句
    决策树
    Logistic回归
    Matplotlab绘图基础
    基本术语
    看懂执行并优化
    数据分析方法论
  • 原文地址:https://www.cnblogs.com/wwqzbl/p/15463915.html
Copyright © 2011-2022 走看看