apply 函数的实现步骤:
- 判断调用对象是否为函数,即使我们是定义在函数的原型上的,但是可能出现使用 call 等方式调用的情况。
- 判断传入上下文对象是否存在,如果不存在,则设置为 window 。
- 将函数作为上下文对象的一个属性。
- 判断参数值是否传入
- 使用上下文对象来调用这个方法,并保存返回结果。
- 删除刚才新增的属性
- 返回结果
Function.prototype.myapply = function(objectArgs,arr){
//使用Symbol是为了防止命名冲突
const key = Symbol('f')
let context = objectArgs || window
context[key] = this
const res = context[key](...arr)
//删除键值
delete context[key]
return res;
}
const person = {
name:'aDong'
}
function fn(n1,n2,n3){
console.log(this);
console.log(n1,n2,n3);
return n1 + n2 + n3
}
const res = fn.myapply(person,[1,2,3])
console.log(res);