用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方法
 
 
posted @ 2021-10-26 00:11  自在逍遥处  阅读(101)  评论(0编辑  收藏  举报