/** * 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));