纯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
相关产品推荐
相关产品推荐

