TS/JS/Node中抽象类公共属性透明观察实现方案咨询
内置可观察能力的抽象基类实现方案问题
我需要实现一个基础抽象类,为所有公共属性内置可观察能力:若属性为对象、数组等引用类型,还需感知其内部值变更。该基类需要适配多种接口与自定义扩展属性,使用该基类的开发者无需额外处理事件、发布订阅或其他通知逻辑,相关能力全部由基类内置。
初始基类结构如下:
abstract class BaseClass { #stores: Map<any, Function[]> subscribe(prop: NonFunctionPropertyNames<this>, callback: (data: CallbackType)=>void){ // 处理订阅逻辑 } unsubscribe(prop: NonFunctionPropertyNames<this>, callback: (data: CallbackType)=>void){ // 处理取消订阅逻辑 } constructor(){ this.#stores = new Map<any, Function[]>() } }
已验证的两种实现方案对比
我已经尝试过Proxy和get/set两种实现方案,二者各有优劣:
Proxy 方案
- 优势
- 可拦截代理类实例上的所有操作,包括引用类型属性的内部变更
- 缺陷
- 无法正确代理私有字段,任何引用私有字段的方法运行时都会触发程序报错
get/set 拦截方案
- 优势
- 无需克隆实例方法,可完美兼容类的私有字段
- 缺陷
- 仅能拦截属性的直接赋值操作,无法感知属性值内部的变更
我目前可暂时接受get/set方案,但该方案要求基类使用者修改引用类型属性的内部值后,必须重新对属性赋值才能触发变更通知,现咨询是否存在其他未考虑到的更优实现方案。
补充业务背景
实际的业务实现类属于框架内的第二方代码,我不一定会亲自实现所有类,但这些类都属于同一IoT设备管理框架的组成部分。我的设计思路是提供BaseClass基础能力与通用接口来约束业务实现类,让特定IoT设备的底层细节逻辑仅封装在对应类中,最终目标是将IoT设备的底层实现细节与应用层的设备调用逻辑完全解耦。
内容的提问来源于stack exchange,提问作者pure_bordem
相关产品推荐
相关产品推荐

