object.create 构建状态分发模型通过原型链共享响应式逻辑:1. 父原型定义不可写方法与共享监听器;2. 子对象用 object.create 绑定该原型,仅存业务数据;3. 变更时显式 notify,支持跨层级通知;4. 订阅基于原型+key 二维索引,轻量可控,体积

用 Object.create 构建状态分发模型,核心在于让子状态对象“继承”父级原型上的响应式能力与共享行为,而非拷贝数据。它不依赖 Proxy 或 class 继承,轻量、可预测、易调试。
1. 父级原型定义统一的响应式契约
父原型不存具体状态值,只提供通用方法(如 notify、on、get)和默认行为,所有子状态共享同一套逻辑入口:
- 用
Object.defineProperty在父原型上定义不可枚举、不可写的方法,避免被子对象意外覆盖 - 把事件监听器数组、变更钩子等共享状态存在父原型的私有属性(如
Symbol('listeners'))上 - 子对象通过
Object.getPrototypeOf(this)显式调用父方法,确保行为一致
2. 子状态对象通过 Object.create 绑定父原型
每个子状态都是独立对象,但原型链指向同一个父原型,实现“一份逻辑、多份数据”:
const userState = Object.create(statePrototype); userState.name = 'Alice';- 子对象自身只存业务字段(如
name,count),无方法冗余 - 调用
userState.notify('name')时,实际执行的是父原型上的notify,自动遍历所有监听该 key 的回调
3. 状态变更触发跨层级通知(支持原型链穿透)
当子状态修改属性时,需主动触发通知;父原型可扩展支持“向上通知”——即某子状态变更后,也通知其父级或兄弟状态关心的依赖:
- 在
set类方法中,除触发当前对象监听外,还可检查Object.getPrototypeOf(this)是否也有同名监听器 - 用
WeakMap关联子对象与其专属监听器,避免内存泄漏;父原型监听器则全局复用 - 例如:
cartState.items = [...]触发 cartState 自身更新,也通知绑定cart.total的 UI 组件(因cart是cartState的父级代理对象)
4. 支持动态挂载与解耦订阅
订阅不绑定到具体实例,而是基于原型+key 的二维索引,便于批量管理:
- 父原型中维护
Map<string set>></string>,以key为键存储所有监听函数 - 子对象调用
on('count', cb)时,实际将cb加入statePrototype.listenersMap.get('count') - 销毁时只需从 Map 中移除对应函数,无需追踪子对象生命周期
这种设计舍弃了自动 getter/setter 拦截,靠显式 set/notify 调用保持可控性,适合中低频状态更新场景,体积小于 1KB,无运行时依赖。










