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

纯JavaScript中父类监听子类回调及销毁通知实现问询

处理带内部逻辑子类的正确实现方案

问题1:纯JavaScript中的实现方式

直接重写实例方法不是最优解,更合理的方案是让子类(A类)在构造时接收销毁回调,这种方式简洁且符合单一职责原则:A类负责自身销毁逻辑,同时通过回调通知管理者(MainClass)执行后续操作。

问题2:向MainClass传递数据

在回调函数中直接携带需要传递的内容(比如实例本身、自定义业务数据)即可,同时通过箭头函数或bind绑定MainClass的上下文,避免丢失管理类的执行环境。

问题3:垃圾回收的可行性

只要原A类实例从classArr中被移除,且没有其他任何变量或对象持有该实例的引用,垃圾回收器就会自动识别并回收它。把temporaryVariable改成let并覆盖变量值,只会改变该变量的引用指向,不会影响原实例的引用计数——原实例的唯一有效引用存在于classArr中,数组中移除后就没有可达引用了,GC会自动处理。


完整实现代码

class A {
  name = 'class a';
  // 私有字段存储销毁回调,避免外部篡改
  #onDestroy;

  constructor(onDestroy) {
    this.#onDestroy = onDestroy;
  }

  destroyCallback() {
    // 执行自身内部销毁逻辑
    console.log(`${this.name} 执行内部销毁逻辑`);
    // 通知MainClass,可携带实例和自定义数据
    this.#onDestroy?.(this, { status: 'destroyed', extra: '自定义业务数据' });
  }
}

class MainClass {
  classArr = [];

  createAInstance() {
    const aInstance = new A((instance, data) => {
      // 接收A实例的销毁通知和数据
      this.removeInstance(instance);
      console.log('收到销毁通知,数据:', data);
    });
    this.classArr.push(aInstance);
    return aInstance;
  }

  removeInstance(targetInstance) {
    // 从活跃数组中移除目标实例
    this.classArr = this.classArr.filter(instance => instance !== targetInstance);
    console.log(`${targetInstance.name} 已从活跃数组移除`);
  }
}

// 使用示例
const main = new MainClass();
const a1 = main.createAInstance();
const a2 = main.createAInstance();

// 触发a1的销毁
a1.destroyCallback();
// 查看剩余活跃实例
console.log('当前活跃实例数量:', main.classArr.length); // 输出1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:24:53