Object.create 结合属性描述符可构建不可变继承模型:用 writable: false、enumerable: false、configurable: false 锁定原型方法,通过只读 getter 暴露冻结状态,子对象仅通过初始化注入并冻结状态,状态更新时创建新实例而非修改原对象。

Object.create 结合属性描述符可以创建严格受控的原型链,适合单向数据流中构建不可变继承模型——关键在于用 writable: false、enumerable: false、configurable: false 锁定属性,并通过只读访问器(getter)暴露状态,避免直接修改。
用 Object.create 建立干净的原型链
避免使用构造函数或 class 关键字,直接用 Object.create 创建无实例状态的“纯行为原型”。父级原型仅定义通用逻辑,不持有可变数据:
- 传入 null 或空对象作为原型基底,防止意外继承内置属性
- 所有状态必须显式注入子对象(如通过 init 方法),而非隐式挂载在原型上
- 示例:
const ViewProto = Object.create(null);
属性描述符锁定核心行为与状态入口
在原型上定义方法时,用 Object.defineProperty 设置不可配置、不可写、不可枚举的描述符,确保行为契约不被覆盖:
-
writable: false防止赋值覆盖方法 -
configurable: false防止 delete 或重新 define -
enumerable: false保持 for...in 和 JSON.stringify 不暴露内部契约 - 对状态访问统一用 getter,返回冻结副本(如
Object.freeze(this._state))
子对象仅通过初始化注入状态,禁止运行时修改
子对象自身不定义可变字段,所有状态来自初始化参数,并立即冻结:
- 调用
Object.create(ViewProto, descriptor)创建实例,descriptor 中每个属性都设为get+enumerable: false - 状态字段如
state只提供 getter,返回Object.freeze({ ...this._initState }) - 更新必须走明确的 action 函数(返回新状态对象),不修改原对象
配合单向数据流:action → reducer → new view instance
每次状态变更,不是 mutate 原 view,而是用新状态创建全新 view 实例:
- reducer 返回新 state 对象(深度冻结)
- 调用
createView(newState),内部执行Object.create(ViewProto, {...}) - 旧 view 自动失效,引用断开,符合不可变语义
- 组件层只接收 view 实例,只读访问其 getter,不接触原型或内部字段

















