object.create 实现的原型快照系统通过分离状态(实例自有属性)与行为(原型方法),仅保存原型引用和自有属性键值对来实现轻量快照;回滚时重置原型链并还原属性即可恢复对应的行为与状态组合。

用 Object.create 实现带“逻辑回滚能力”的原型快照系统,核心不是深拷贝整个对象,而是利用原型链的可替换性,在不污染原对象的前提下,动态切换行为层。关键在于把“状态”和“行为”分离,把可变数据存在实例上,把不可变逻辑(方法、默认配置)放在原型上,并通过快照保存原型引用与实例数据的组合关系。
快照的本质:保存「原型引用 + 实例自有属性」的快照对
每次创建快照时,不复制方法或原型链,只记录两件事:
- 当前对象的
__proto__(即它正在使用的原型对象) - 当前对象所有
hasOwnProperty为true的自有属性键值对(即实际变动的数据)
这样快照极轻量,且天然支持原型方法复用。回滚时,只需重置原型 + 还原自有属性即可恢复到当时的行为+状态组合。
构造可快照对象:用 Object.create 分离数据与逻辑
定义一个基础行为原型(含方法、默认值),再用 Object.create(proto) 创建实例,确保所有可变字段都写在实例上:
const BehaviorProto = {
increment() { this.count = (this.count || 0) + 1; },
reset() { this.count = 0; },
get value() { return this.count || 0; }
};
function createSnapshotable() {
const instance = Object.create(BehaviorProto);
// 所有可变状态显式初始化在实例上
instance.count = 0;
return instance;
}
const obj = createSnapshotable();
obj.increment(); // count → 1
实现快照与回滚:管理原型链 + 属性映射
快照类封装保存与还原逻辑,不侵入业务对象:
class SnapshotManager {
constructor(target) {
this.target = target;
this.snapshots = [];
}
take() {
const proto = Object.getPrototypeOf(this.target);
const ownProps = {};
for (const key of Object.getOwnPropertyNames(this.target)) {
ownProps[key] = this.target[key];
}
this.snapshots.push({ proto, ownProps });
}
rollback() {
if (this.snapshots.length === 0) return;
const last = this.snapshots.pop();
Object.setPrototypeOf(this.target, last.proto);
// 清空当前自有属性(保留原型上的访问器等)
for (const key of Object.getOwnPropertyNames(this.target)) {
if (!(key in last.proto)) delete this.target[key];
}
// 写回快照时的自有属性
Object.assign(this.target, last.ownProps);
}
}
// 使用示例
const obj = createSnapshotable();
const mgr = new SnapshotManager(obj);
obj.increment(); // count = 1
mgr.take();
obj.increment(); // count = 2
obj.name = "test";
mgr.take(); // 快照:proto=BehaviorProto, ownProps={count:2, name:"test"}
obj.increment(); // count = 3
mgr.rollback(); // 回滚后:count=2, name="test", 方法仍来自 BehaviorProto
支持多级快照与原型热替换(进阶)
若需在运行时切换行为(如 A/B 测试、功能开关),可让多个行为原型共存,快照中保存的是具体原型引用 —— 回滚不仅恢复数据,也恢复当时的逻辑版本:
- 定义
BehaviorProtoV1和BehaviorProtoV2 - 调用
Object.setPrototypeOf(obj, BehaviorProtoV2)切换逻辑 - 快照自动捕获当前所用原型,回滚即还原整套行为+状态
这种方式下,“逻辑回滚”真正成立:不仅是数据倒退,连 obj.doSomething() 的执行路径也回到快照时刻的原型定义。










