call的实现很简单,了解它涉及了this的指向和原型(prototype)这方面的知识。
实现思路:
- 获取 selfCall 内部传入的参数
- 获取到 call 要改变 this 指向的函数
- 在函数上创建一个 fn 属性 赋值 this
- 清空各类属性
/*
selfCall 方法的实现
a.call(b) // 把 a 的 this 指向 b 的 this
*/
Function.prototype.selfCall = function(obj){
const arg = arguments
// 第一个默认是要a把this指向b的那个对象b this = b,因此截取掉 b,只保留 a.call(b,param1,param2)
const args = Array.prototype.slice.apply(arguments,[1]) //[b,param1,param2] => [param1,param2]
/*
* b.fn = a
*/
obj.fn = this // 调用 selfCall 的函数 的this 例如下面的例子就是 fullName
// 把后面的参数传过去相当于 b.fn.apply(b,args) fn现在是 a了 相当于a(...args)
obj.fn(...args)
delete obj.fn // 相当于去除 b新绑定的fn,因为 a这时候里面的this已经指向了b
}
执行测试
var person = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
var person1 = {
firstName:"Bill",
lastName: "Gates",
}
var person2 = {
firstName:"Steve",
lastName: "Jobs",
}
person.fullName.selfCall(person1);
// Bill Gates
call如何实现,你学会了么?那么动手去试下下 apply吧~ 最后希望收获的你也送我一个赞。