JavaScript原型链通过[[Prototype]]实现行为委托,即对象直接委托另一对象的方法而非继承类结构;使用Object.create建立委托关系,委托者共享方法但不继承数据属性,状态与行为分离,this始终指向调用者,委托链最终终止于null。

JavaScript 中原型链实现行为委托,核心是让一个对象通过 [[Prototype]] 链“借用”另一个对象的方法,而不是复制或继承类结构。它不依赖构造函数和 new,而是直接建立对象到对象的委托关系。
用 Object.create 建立委托关系
这是最直观、最干净的方式。传入一个行为对象,新对象的 [[Prototype]] 就指向它:
const parent = { speak() { console.log("Hi"); } };const child = Object.create(parent);child.speak(); // "Hi" —— child 自身没有 speak,委托给 parent 执行
此时 child.__proto__ === parent,委托链形成。注意:child 不会拥有 parent 的数据属性(如 name),只共享方法逻辑。
状态与行为分离:数据存委托者,方法存委托目标
委托设计强调职责清晰:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 把状态(如
id、label)存在实际使用的对象上(如child.id = 123) - 把通用行为(如
setId()、outputId())定义在被委托的对象上 - 调用时
this始终绑定在发起调用的对象上,所以方法能正确读写其自身状态
例如:child.setId(456) 中,setId 在 parent 上,但 this 是 child,因此 child.id 被赋值。
避免同名方法带来的歧义
委托不是为了“重写”,而是为了“复用”。不同层级尽量不用相同方法名:
- 如果
parent有init(),child也定义init(),就会遮蔽委托,失去复用意义 - 更推荐语义化命名,比如
child.prepareTask()内部调用parent.setID() - 若必须调用同名父级方法,需显式写
parent.init.call(this),但这已偏离委托初衷
委托链终点始终是 null
无论怎么构建,委托链最终都会终止于 null:
Object.getPrototypeOf(child) === parentObject.getPrototypeOf(parent) === Object.prototypeObject.getPrototypeOf(Object.prototype) === null
引擎查找属性时,沿着这条链逐级向上,找不到就返回 undefined;一旦抵达 null,查找结束。这个机制天然支持多层委托,比如 A → B → C → null。

















