call原理实现精讲

196 阅读1分钟

call的实现很简单,了解它涉及了this的指向和原型(prototype)这方面的知识。

实现思路:

  1. 获取 selfCall 内部传入的参数
  2. 获取到 call 要改变 this 指向的函数
  3. 在函数上创建一个 fn 属性 赋值 this
  4. 清空各类属性
/*
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吧~ 最后希望收获的你也送我一个赞。