javascript原型继承天然支持行为委托模式,对象运行时将未找到的属性委托给原型链上的其他对象处理,通过object.create可实现干净的委托关系。

JavaScript 中的原型继承天然支持行为委托模式——对象不复制方法,而是把找不到的属性或方法“委托”给原型链上的其他对象处理。
理解行为委托的核心逻辑
行为委托不是“类式继承”,而是让一个对象在自身找不到某个属性时,自动向另一个对象(通常是它的 prototype)查找。这正是 JavaScript 原型链的工作机制。
关键点:
- 委托发生在运行时,不是创建实例时复制方法
- 被委托的对象(如原型)可以动态修改,所有委托它的实例立即获得新行为
- 没有“父类”“子类”概念,只有“对象 A 委托给对象 B”
用 Object.create 实现干净的委托关系
Object.create(proto) 是最直接体现委托的方式:它创建一个新对象,并将其内部 [[Prototype]] 指向 proto,不执行构造函数,也不引入多余属性。
示例:
const animal = {
speak() {
return `I'm ${this.name}`;
},
eat(food) {
return `${this.name} eats ${food}`;
}
};
const dog = Object.create(animal);
dog.name = 'Buddy';
dog.bark = function() { return `${this.name} barks!` };
console.log(dog.speak()); // "I'm Buddy" → 委托给 animal
console.log(dog.bark()); // "Buddy barks!" → 自身拥有
console.log(dog.eat('meat')); // "Buddy eats meat" → 委托给 animal
这里 dog 没有复制 speak 或 eat,只是在需要时向 animal 查找——这就是行为委托。
避免构造函数干扰委托清晰性
用 function + new 构造实例虽常见,但容易混淆委托意图(比如误以为在“继承类”)。若坚持使用,建议:
- 把共享方法统一挂到构造函数的 prototype 上,而非在构造函数内重复赋值
- 确保实例只保留自身状态(如 this.name),行为全部委托出去
- 必要时用 Object.setPrototypeOf(instance, sharedMethods) 动态切换委托目标
例如,可让多个实例委托同一个方法对象,而不是各自绑定闭包函数,节省内存且便于统一更新。
委托链可以多层,但不宜过深
JavaScript 允许链式委托:A → B → C → null。比如:
const canRun = { run() { return `${this.name} runs`; } };
const canSwim = { swim() { return `${this.name} swims`; } };
const duck = Object.create(canSwim);
Object.setPrototypeOf(duck, canRun); // 现在 duck 委托 canSwim,canSwim 委托 canRun(需手动设置)
但实际中更推荐扁平委托:用 Object.assign 合并多个行为对象,再用 Object.create 委托这个组合对象,语义更明确、调试更直观。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











