这三个方法都是Object的原型上的方法 为了避免冲突命名为myXXX
// call,apply和bind就是绑定一个方法到传入的this上没有传this就加到对象上 然后调用返回结果 bind返回一个方法的调用的函数
Object.prototype.myCall = function (ctx = window, ...args) {
ctx.fn = this // foo.call() this指向的就是foo这个函数,将函数赋值给创建的对象 然后调用
return ctx.fn(...args)
}
// apply参数传入的是一个数组
Object.prototype.myApply = function (ctx = window, args) {
ctx.fn = this
return ctx.fn(...args)
}
Object.prototype.myBind = function (ctx = window, ...args) {
ctx.fn = this
return () => ctx.fn(...args) // return bind了this后的函数
}
function foo(a, b) {
return this.c + a + b
}
console.log(Array.prototype.indexOf.myCall([1, 2, 3], 1)) // 0
const fn = foo.myBind({ c: 3 }, 1, 2)
console.log(fn()) // 6
本质就是把要执行的方法挂到将要指向的this上执行或者返回调用句柄