如何避免子类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
相关产品推荐
相关产品推荐

