Object.create 构建的配置系统通过分离数据与行为、分层原型链、语义化插拔接口及快照回滚机制,实现运行时动态切换策略且保留实例配置。

用 Object.create 构建支持“原型链动态插拔”的业务配置系统,核心在于把配置项(数据)和配置行为(逻辑)彻底分离,并利用原型链可实时替换的特性,实现运行时切换策略、环境或功能模块——不改实例、不重实例、只换原型。
配置与行为必须物理隔离
所有可变配置值(如 API 地址、超时时间、开关状态)必须显式写在实例对象上;所有方法、计算逻辑、默认值、校验规则等不可变行为,必须定义在独立的原型对象中。不能混写,否则无法安全插拔。
- ✅ 正确:实例只存
apiUrl、timeout、debug等字段;原型提供fetch()、validate()、getHeaders() - ❌ 错误:在实例上直接定义
fetch: function(){...}或把默认值硬编码在方法里
设计多层级可插拔原型结构
按职责拆分原型层级,例如:BaseProto → EnvProto(dev/test/prod)→ FeatureProto(auth/logging/metrics)→ OverrideProto(临时调试)。每层只负责一类逻辑,通过 Object.create 链式继承构建:
const devProto = Object.create(BaseProto); devProto.apiUrl = 'https://api.dev';const authProto = Object.create(devProto); authProto.requireToken = true;- 实例创建时:
const cfg = Object.create(authProto); cfg.timeout = 8000;
后续只需调用 Object.setPrototypeOf(cfg, newProto) 即可瞬间切换整套行为,且已有配置值(timeout 等)全部保留。
封装插拔控制接口,避免直接操作 __proto__
不暴露底层原型操作,统一提供语义化方法,比如 useEnv('prod')、enableFeature('logging')、rollbackTo('v2.1')。这些方法内部做两件事:
- 查找到目标原型对象(可缓存、可按版本/标签索引)
- 调用
Object.setPrototypeOf(instance, targetProto)并触发一次onConfigChange通知
这样业务代码完全不用感知原型链细节,只关心“我要什么能力”,系统自动组装对应原型链。
支持快照 + 回滚的轻量状态管理
每次插拔前,记录当前原型引用 + 所有自有属性(Object.keys(instance).filter(k => instance.hasOwnProperty(k))),形成一个快照对象。回滚时:
- 还原
Object.setPrototypeOf(instance, snapshot.proto) - 逐个赋值
instance[key] = snapshot.data[key]
无需深拷贝、不依赖 Proxy、无性能损耗,适合高频切换场景(如 A/B 测试、灰度发布、本地模拟不同服务端响应)。

















