Call方法实现
Call方法做了什么?将任意函数成为指定对象的方法进行调用;
实现思路:让该函数在指定的对象中进行调用。即让该函数成为指定对象的方法并在指定对象调用完毕后进行删除这个方法;如果函数有返回值那么使用call方法调用该函数以后也应该有返回值。
首先写一个Call方法函数
function myCall(obj){
注意: 这里需要传入一个实参obj
obj = obj||window
let obj.objFn = this //获取函数
let params = [...arguments].slice(1)//获取第二位开始的形参,若未传入则为空
let result = obj.objFn(...params);//获取函数调用的返回值
delete obj.objFn
return result
}
几个关键要素
- Call方法内是否传入形参
(1)无形参
- 将实参obj赋值window(因为原生call方法在没有传入对象时就使用全局对象进行调用该函数)
测试
const obj1 = {
name: 'obj1',
f1() {
console.log(this);
}
}
obj1.f1.call() //window
实现
obj = obj||window
- 一个形参
- 多个形参
let params = [...arguments].splice(1)
splice返回截取后的原数组
一个形参:空数组slice(1)以后仍然返回空数组,
多个形参:slice返回截取后的新数组
- 万一对象中有属性方法名为objFn:命名冲突(使用随意命名判断法解决)
function myCall(obj){
let UniqueId = Math.random()+'oo'
while (obj.hasOwnProperty(UniqueId)) {
UniqueId += '00'
}
}