You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免子类set方法被Map父类构造函数内部逻辑调用?

避免Map构造函数调用子类重写的set方法

当你扩展Map并重写set方法后,Map构造函数在处理可迭代参数时,会自动调用实例的set方法,这就是创建实例时多次触发自定义逻辑的原因。要保留set方法名的同时解决这个问题,有两种可靠实现方式:

方法一:手动初始化,调用父类set

跳过Map构造函数的自动初始化逻辑,先调用空参数的super(),再手动遍历传入的可迭代对象,用super.set()直接调用父类的set完成初始化:

class ModifiedMap extends Map {
  constructor(arg) {
    super(); // 不传参数,避免构造函数自动调用子类set
    if (arg) {
      // 手动遍历参数,用父类set完成初始化
      for (const [key, value] of arg) {
        super.set(key, value);
      }
    }
  }

  set(key, value) {
    console.log("doing some work here");
    // 调用父类set完成实际存储
    return super.set(key, value);
  }
}

测试验证:

// 初始化时不会打印自定义日志
const map = new ModifiedMap([["a", "apple"], ["b", "orange"], ["c", "banana"]]);
// 手动调用set时才触发自定义逻辑
map.set("d", "date"); // 输出:doing some work here

方法二:临时替换子类set(仅作参考,不推荐)

在构造函数中临时将子类的set替换为父类实现,完成初始化后再恢复。这种方式不够直观且有潜在风险,仅作扩展思路:

class ModifiedMap extends Map {
  constructor(arg) {
    // 临时保存子类set,替换为父类set
    const originalSet = this.set;
    this.set = super.set;
    // 调用父类构造函数完成初始化
    super(arg);
    // 恢复子类set
    this.set = originalSet;
  }

  set(key, value) {
    console.log("doing some work here");
    return super.set(key, value);
  }
}

核心逻辑:Map构造函数处理可迭代参数时,会通过this.set调用实例方法,只要让构造阶段的this.set指向父类原始实现,就能避免触发自定义逻辑。

内容的提问来源于stack exchange,提问作者MaximPro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:23:31