自己封装一个bind方法,需要考虑以下几点:
- 参数的获取(方法里面的参数和bind返回的函数的参数)
- this的保存
- apply或者call的使用
Function.prototype.bind = function (...arg1) {
//保存this,这里的this指的是test方法
let self = this;
//取出第一个参数,也就是this的指向对象
let obj = arg1[0];
if (typeof obj === "object") {
obj = obj || window; // obj 如果是null就会赋值为window
} else {
obj = Object.create(null);
}
//剩余参数保存起来
let params1 = arg1.slice(1);
//返回一个待执行的函数
return function (...arg2) {
//和第一个参数合并为完整的参数
let params2 = params1.concat(arg2);
//调用apply方法进行this转换
return self.apply(obj, params2);
};
};
var test = function (a, b, c) {
console.log("x=" + this.x, "a=" + a, "b=" + b, "c=" + c);
};
var o = {
x: 1,
};
test.bind(o, 1)(2, 3); //x=1 a=1 b=2 c=3
网友评论