手动实现call

2023-05-28 16:25:53 浏览数 (2)

分析:

  1. 将函数设为对象的属性
  2. 执行&删除这个函数
  3. 指定this到函数并传入给定参数执行函数
  4. 如果不传入参数,默认指向为 window
代码语言:javascript复制
Function.prototype.myCall = function (ctx, ...args) {
    // call的第一个参数为null/undefined时,this则指向全局window(这里是浏览器环境,node环境则不是window),其余则转为对象
    ctx = (ctx === null || ctx === undefined) ? window : Object(ctx);
    // 这里之所以采用symbol,是为了避免和对象的属性重名
    const func = Symbol('func');
    // 优化打印this的console值
    Object.defineProperty(ctx, func, {
        enumerable: false,
        value: this,
    })
    const result = ctx[func](...args);
    delete ctx[func];
    return result;
}  

0 人点赞