单手一个八拍带你实现一个call() ~~skr skr
2019-07-19 本文已影响0人
sherlockAndy
- call() 方法调用者是一个函数体 (this 指向,谁调用该方法,this就指向谁) 所以 可以将该函数体 赋值给目标对象的一个属性 , 这样该对象就有了这个方法
- 调用该方法传入可选参数
- 删除掉 赋值给 该对象的自定义方法
Function.prototype.myCall = function (targetObj, paramter) {
targetObj.fn = this; // 1. 将要调用的函数体 赋值给目标对象的属性
targetObj.fn(...paramter) // 2. 目标对象调用该方法
delete targetObj.fn; // 3. 删除之前赋值给目标对象的方法
}
// 思考: 加入该对象上已经有了 fn 属性 ,那上面的代码是不是会将原有的值覆盖掉 ,所有我们要确保他的唯一性
// 通过 Es6 的Symbol来解决这个问题
Function.prototype.my_Call = function (context, paramter) {
if (typeof context === "object") {
context = context || window;
} else {
Object.create(null)
}
let fn = Symbol()
context[fn] = this;
const result = context[fn](...paramter);
delete context.fn;
return result;
}
obj1.sayHello.my_Call(obj_2, 'my_Call');
怎么样, 是不是很skr!