子类访问器需通过原型委托+微任务队列实现自动同步:getter/setter定义在父类原型上,子类不重名覆盖;异步逻辑抽为_protected方法(如_fetchstate、_updatestate);setter必须返回promise且不await;禁止实例直接赋值以防降级为数据属性。

要让子类访问器在微任务流中自动同步状态,核心不是“加锁”或“强制等待”,而是利用原型委托机制 + 微任务队列的天然顺序性,确保每次读写都触发同一套异步逻辑,避免中间态泄漏。
保持原型链委托不被遮蔽
父类访问器必须定义在原型上,且不可被子类意外覆盖:
- 用 class 语法声明 getter/setter(默认 configurable: true),比 Object.defineProperty 更安全
- 子类不要声明同名 get/set —— 只要不写,访问就会自动落到父类原型上,Promise.then 或 queueMicrotask 自然入队
- 禁止对实例直接赋值:obj.prop = x 若父类无 setter,会在实例上生成数据属性,从此绕过所有微任务逻辑
把异步核心抽成可复用方法
不要把 Promise 构造和业务逻辑全塞进 getter 内;应拆出纯返回 Promise 的受保护方法:
- 父类定义 _fetchState() 返回 Promise,getter 仅调用它并返回结果
- 子类重写 getter 时,可 return super._fetchState().then(...),延续微任务链
- setter 同理:用 _updateState(value) 封装异步更新,setter 中只负责调用并返回该 Promise
写操作必须返回 Promise 并统一处理完成时机
同步 setter 不适合微任务场景,容易造成状态不一致:
- setter 内部不要 await,而应 return this._updateState(v),让调用方决定是否 await
- 若需“写后立刻读最新值”,应组合使用:await obj.setState(v); const val = await obj.state;
- 多个连续写操作会生成多个微任务,它们按入队顺序执行,天然满足原子级串行——无需额外协调
读写过程全程拒绝数据属性降级
防止因缺失 setter 或误赋值导致访问器逻辑失效:
- 父类 setter 应做校验:若接收非预期类型,抛错或静默忽略,避免静默创建实例属性
- 必要时在 setter 中用 Object.defineProperty(this, 'prop', { writable: false }) 锁定实例属性,强制走原型逻辑
- 测试时检查 Object.getOwnPropertyDescriptor(obj, 'prop'),确认始终是 accessor 类型,而非 value










