call
首先需要了解一下call的使用方法
let obj = {
name: 'zhangsan'
}
function a() {
console.log(this)
console.log(this.name)
}
a.call(obj)
this指向了obj,所以我们需要做的是,改变一下this的指向
封装一个call
Function.prototype._call = function(...arg) {
let _one = [...arg][0]
_one.fn = this // 注意,这里的this指向的是调用_call的函数
let result = _one.fn(...[...arg].slice(1)) // 将后续的参数传入函数,在这一步实现了this指向传入的第一个参数
delete _one.fn // 别忘了删掉增加的属性
return result
}
function a(...args) {
console.log(this.name)
console.log(...args)
}
a._call(obj, 1, 2)
这里要注意this之间的转变,开始的this指向的是调用call的方法,但是之后执行方法的时候,this将会指向传入的对象,实现call方法