实现代码如下:
/* 用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方法