大概思路就是将 你要调用的方法 添加为对象里面的属性方法,这样就改变了方法里面的htis指向obj,然后调用该对象里面的方法,调用完成后,再将对象里面的此方法删除delete,将调用的结果返回。
// 手写实现call方法,改变this指向 const obj = { name: 'zs', }; const person = { add(a, b, c) { console.log(a, b, c); return this.name; }, }; Function.prototype.myCall = function (context) { if (typeof this !== 'function') { throw new Error('error'); } // 获取到除了除了context的其他参数,args为一个数组 let args = [...arguments].slice(1); // 如果没有传递参数,则默认this指向为window context = context || window; // 在对象obj中添加 你要所有改变this指向的方法,相当于在对象obj中添加了一个方法 context.fn = this; // 然后执行该对象里面的方法,此时this为当前的对象obj,则会打印出'zs' let result = context.fn(...args); // 再将该方法从对象obj里面删除 delete context.fn; // 将函数运行的结果返回回去 return result; }; console.log(person.add.myCall(obj, 1, 2, 3));
运行结果如下