实现bind的步骤,我们可以分解成为三部分:
- 修改this指向
- 动态传递参数
- 兼容new关键字
Function.prototype.mBind = function (context) {
// 判断调用对象是否为函数
if (typeof this !== "function") {
throw new TypeError("Error");
}
// 获取参数
const args = [...arguments].slice(1),
self = this;
return function Fn() {
// 根据调用方式,传入不同绑定值
oo = this instanceof Fn ? new self(...arguments) : context //
return self.apply(oo, args.concat(...arguments));
}
}
// 测试
function p(name, age) {
console.log('打印:', this.value, name, age);
}
var obj = {
value: '易'
}
p.mBind(obj, '四鸹岽')(16); //打印: 易 四鸹岽 16