JavaScript原型链是运行时可干预的动态结构,支持属性别名、方法注入与行为增强;可通过Object.create构建代理原型、动态扩展prototype、Object.setPrototypeOf切换原型及Proxy+原型链实现条件化映射。

JavaScript 的原型链不是静态结构,而是运行时可干预的活链路。利用它的动态特性,可以在不修改原始对象、不污染实例的前提下,实现属性别名、方法注入、行为增强等灵活操作。关键在于理解“查找即委托”这一机制——所有访问都走链式查找,我们只需在合适位置插入逻辑,就能改变行为。
用 Object.create 构建轻量代理原型
这是最干净的动态映射方式:创建一个空对象作为中间代理,让它继承源数据,并在其上定义 getter/setter,把对别名(如 name)的读写,转发到真实字段(如 user_name)。
- 不改动源对象,也不往实例上挂属性,完全解耦
- 多个实例可共享同一代理原型,节省内存
- 适合统一处理 API 响应字段(如 user_id → id、full_name → name)
向构造函数 prototype 动态追加方法
已有和新建的实例都能立刻使用新方法,因为它们的 __proto__ 都指向同一个 prototype 对象。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 直接赋值:
MyClass.prototype.log = function() { console.log(this); }; - 批量添加更安全:
Object.assign(MyClass.prototype, { save() {}, validate() {} }); - 注意:若已调用
Object.freeze(MyClass.prototype),则无法再添加
用 Object.setPrototypeOf 切换已有对象的原型
对单个已存在对象临时赋予新能力,比如给普通字面量对象注入工具方法。
立即学习“Java免费学习笔记(深入)”;
- 先定义能力集合:
const logger = { debug() { console.debug(...arguments); } }; - 再切换原型:
Object.setPrototypeOf(myObj, logger); - 之后
myObj.debug()就能调用,且后续对logger的扩展也会生效(只要没冻结)
结合 Proxy 与原型链做条件化映射
Proxy 负责拦截访问,原型链负责 fallback 查找,两者配合可实现带逻辑的动态路由。
- 在 Proxy 的
get中先检查是否命中映射规则(如 fullName → firstName + lastName) - 不匹配时,委托给
Reflect.get(target, key, receiver),让原型链正常工作 - 这样既保留了原生继承行为,又叠加了运行时计算逻辑

















