javascript中的call方法是使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。这样就可以修改this的指向。
下面是如何自己实现一个call方法,主要注意的点是,如何修改this的指向,我们都知道在普通函数中this是指向函数的调用者,那么我们要达到将this指向传入的target上即可,也就是说使用target来调用我们想调用的函数就可以,所以可以将需要调用的函数作为target对象上的一个属性,通过target.fn的方式来调用,就可以修改fn内部的this指向了。最后记着要删除掉我们自己在target上添加的fn属性即可。
Function.prototype.myCall = function (target) {
// 判断调用对象
if (typeof this !== "function") {
console.error("type error");
}
// 获取函数的参数
let args = [...arguments].slice(1)
// 判断是否传入目标对象
target = target || window
// 将函数作为目标对象的一个属性
target.fn = this
// 调用函数
let res = target.fn(...args)
// 删除刚才新增的函数属性
delete target.fn
return res
}
调用:
let obj = {
mail : "xxx.com"
}
function sayHi(name, age) {
console.log(this.mail);
console.log(name, age);
}
sayHi.myCall(obj, 'liderder', 21)
运行结果:
这样就大致的实现了一个call方法的基本功能了。