一、手写call
const person = {name:'zhangsan'}
function foo(numA,numB){console.log(this)console.log(numA,numB)return numA + numB
}// 手写call
Function.prototype.mycall = function(thisArg,...args){ // 手写callconst key = Symbol('key') // 唯一标识符thisArg[key] = this // 绑定thisconst res = thisArg[key](...args) // 展开参数delete thisArg[key] // 清除return res
}const res = foo.mycall(person,1,2) // thisArg = person
console.log(res)
二、手写apply
Function.prototype.myapply = function(thisArg,args){const key = Symbol('key')thisArg[key] = thisconst res = thisArg[key](...args)delete thisArg[key]return res
}const person = {name:'zhangsna'}
function foo(numA,numB){console.log(this)console.log(numA,numB)return numA+numB
}
const res = foo.myapply(person,[1,2])
console.log(res)
三、手写bind
// 手写bind
Function.prototype.myBind = function(thisArg,...args){// 返回新函数return (...reArgs)=> this.call(thisArg,...args,...reArgs)
}const person = {name:'zhangsan'}
function foo(numA,numB,numC,numD){console.log(this)console.log(numA,numB,numC,numD)return numA + numB + numC + numD
}
const bindFunc = foo.myBind(person,1,2)
const res = bindFunc(3,4)
console.log(res)