手写实现 JavaScript 中的 call 方法
步骤:
创建一个新的函数对象,作为 call 方法的实现。
在新的函数对象中,将传入的第一个参数作为要调用的函数,将其保存在一个变量中。
使用 arguments 对象获取传入的参数列表,并将其转换为数组。
使用 apply 方法调用保存的函数,并传入第一个参数作为上下文对象(即函数中的 this 值),以及转换后的参数数组。
返回调用结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| Function.prototype.myCall = function (context, ...args) { // 判断是否传入了上下文对象,如果没有,则使用全局对象(浏览器中为 window) context = context || window;
// 将当前函数保存在变量中 const fn = Symbol('fn'); context[fn] = this;
// 使用 apply 方法调用函数,并传入上下文对象和参数数组 const result = context[fn](...args);
// 删除临时保存的函数 delete context[fn];
// 返回调用结果 return result; };
// 示例用法 const person = { name: 'John', greet: function(message) { console.log(`${message}, ${this.name}!`); } };
const otherPerson = { name: 'Jane' };
person.greet.myCall(otherPerson, 'Hello'); // 输出:Hello, Jane!
|
在 JavaScript 中,Symbol 是一种特殊的数据类型,用于创建唯一的标识符。它可以用于优化对象属性的访问和避免命名冲突。