重构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
}()