/**
* call函数是的实现
* 把调用call函数的this指向call函数中的第一个参数 然后把执行结果返回
* obj2.con = obj1.con 然后返回 obj2.con()的执行结果
*
* @param {*} context
* @param {...any} arg
* @returns
*/
Function.prototype.myCall = function(context, ...arg) {
//判断参数是否有值
context = context || window;
arg = arg ? arg : [];
// 创建一个私有方法名字
const meatName = Symbol('防止重写context上的属性或方法');
// call函数只能被函数调用,此处的this指向调用call的函数
context[meatName] = this;
// 等同于 obj2.con = obj1.con
// 执行context的私有方法
const result = context[meatName](arg);
// 等同于 obj2.con()
// 删除私有方法
delete context[meatName];
// 将方法结果返回
return result
}
const obj1 = {
name: 'obj1',
con() {
console.log(this.name);
},
};
const obj2 = {
name: 'obj2',
};
console.log(obj1.con.myCall(obj2));