Function.prototype.mycall = function (context, ...args) {
let cxt = context || window
//确保唯一
let fn = Symbol()
//在cxt中添加方法,this是调用call的函数
cxt[fn] = this
//调用方法,记录结果
const res = cxt[fn](...args)
//在cxt中删去添加的方法
delete cxt[fn]
//返回结果
return res
}
Function.prototype.myapply = function (context, args = []) {
let cxt = context || window
//确保唯一
let fn = Symbol()
//在cxt中添加方法,this是调用call的函数
cxt[fn] = this
//调用方法,记录结果
const res = cxt[fn](...args)
//在cxt中删去添加的方法
delete cxt[fn]
//返回结果
return res
}
Function.prototype.mybind = function (context, ...args) {
//表示当前函数
const fn = this
let newFn = function (...args2) {
fn.apply(context, [...args, ...args2])
}
//让newFn继承目标函数的原型,保证能调用其原型上的方法
newFn.prototype = Object.create(context.prototype)
newFn.prototype.constructor = newFn
//返回一个函数,在其中调用fn
return newFn
}
三者的功能都是改变this指向
而区别主要在于:1.call和apply直接返回结果,而bind返回的是一个函数
2.call与apply参数输入为依次传参,而apply参数输入为参数数组
3.call与apply需要直接输入参数,而bind既可以直接输入,也可以在返回的函数 中输入
例:fn.bind(context,args)=fn.bind(context)(args)