重构call

142 阅读1分钟

重构call

实现原理

let obj = {
  name:'张三'
}
function sayName() { 
  console.log(this.name)
}
//第一步:引用方法到自身
obj.sayName = sayName
//第二步:使用
obj.sayName()//输出:'张三'

实战修改

//重构call方法
~function () {
  //全局的window
  var self = this
  function myCall(context, ...agrs) { 
    //未传参,赋全局window
    context || (context = self)
    //判断context是否为引用类型,不是修改为引用类型
    context = typeof context !=='object' ? {}:context
    //修改this (即实现原理:第一步:引用方法到自身)
    context[Symbol.for('Fn')] = this
    //调用方法 (即实现原理:第二步:使用)
    let result = context[Symbol.for('Fn')](...agrs)
    //删除多余方法
    delete context[Symbol.for('Fn')]
    //返回当前引用
    return result
  }
  Function.prototype.myCall = myCall
}()