Object.create 实现多层级策略降级:按实例→环境→业务域→兜底顺序构建原型链,自动委托查找;支持热更新、显式降级控制及无副作用方法设计。

用 Object.create 实现多层级行为降级的策略处理器,核心是利用原型链天然的“属性查找失败时向上委托”机制——把不同优先级的策略对象按降级顺序串成原型链,访问某个策略方法时,JS 自动从最具体层开始找,找不到就逐级往上,直到兜底层。
设计分层策略原型链
定义清晰的层级语义,例如:
- 实例层:运行时动态配置(如用户 ID、灰度标识),最高优先级
- 环境层:当前部署环境(prod/staging/dev),次高优先级
- 业务域层:模块/功能域默认策略(如 “payment”、“login”)
- 全局兜底层:所有策略的最终 fallback,必须提供完整方法签名
每一层都是普通对象,只定义自己“有差异”的策略方法,其余方法不写,靠原型链继承。
构造可组合的策略工厂
封装一个函数,接收各层策略对象,返回具备降级能力的策略实例:
function createStrategy(instance = {}, env = {}, domain = {}, fallback = {}) {
// 按降级顺序:instance → env → domain → fallback
const strategy = Object.create(fallback);
Object.setPrototypeOf(strategy, Object.assign(Object.create(domain), env));
Object.setPrototypeOf(strategy, instance);
return strategy;
}
更健壮的做法是逐层创建并链接(避免污染原始对象):
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
function createStrategy(instance, env, domain, fallback) {
const fallbackProto = { ...fallback };
const domainProto = Object.assign(Object.create(fallbackProto), domain);
const envProto = Object.assign(Object.create(domainProto), env);
const instanceProto = Object.assign(Object.create(envProto), instance);
return instanceProto;
}
支持运行时策略热更新
降级链不是静态的——比如灰度开关变化后,需要替换实例层。可暴露 updateInstance 方法:
function createStrategy(instance, env, domain, fallback) {
const fallbackProto = { ...fallback };
const domainProto = Object.create(fallbackProto);
Object.assign(domainProto, domain);
const envProto = Object.create(domainProto);
Object.assign(envProto, env);
const strategy = Object.create(envProto);
strategy.updateInstance = (newInstance) => {
// 替换实例层原型(注意:不能直接改 __proto__,用 Object.setPrototypeOf)
Object.setPrototypeOf(strategy, Object.assign(Object.create(envProto), newInstance));
};
Object.assign(strategy, instance);
return strategy;
}
调用 strategy.updateInstance({ handlePayment: newHandler }) 即可局部刷新,不影响其他层。
策略方法需统一接口 + 显式降级控制
为避免意外跳过某层,所有策略方法应显式支持“是否继续降级”:
const fallback = {
fetchUserData(options) {
console.log('→ 使用兜底策略');
return { status: 'fallback', data: null };
}
};
const domain = {
fetchUserData(options) {
if (options.skipFallback) return null; // 主动终止降级
console.log('→ 使用 domain 默认策略');
return { status: 'domain', data: { name: 'default' } };
}
};
const instance = {
fetchUserData(options) {
if (options.userId === 'vip-123') {
console.log('→ 实例层命中 VIP 策略');
return { status: 'vip', data: { name: 'VIP User' } };
}
// 不 return → 自动委托给 domain 层
}
};
这样既保留原型链自动降级的简洁性,又允许某层主动截断或条件跳过。
不复杂但容易忽略:确保每层策略对象自身不覆盖 constructor 或 toString 等基础属性,否则可能干扰原型链行为;所有策略方法尽量保持无副作用、幂等,便于测试和组合。

















