javascript用原型链实现行为委托,即对象通过__proto__或object.setprototypeof()指向另一对象,属性访问时动态沿链查找而非复制方法;所有对象默认继承object.prototype,函数prototype仅在new时生效,推荐用object.setprototypeof或object.create建立委托关系。

JavaScript 中用原型链实现对象间行为委托,核心是让一个对象的 __proto__(或通过 Object.setPrototypeOf())指向另一个对象,从而在自身找不到属性或方法时,自动沿原型链向上查找——这正是委托机制的本质。
理解委托:不是复制,而是动态查找
委托 ≠ 拷贝方法到当前对象。它依赖运行时的属性访问规则:当你读取 obj.method 时,JS 引擎会按 obj → obj.__proto → obj.__proto__.__proto → ... → null 的顺序逐级查找,直到找到或到达原型链末端。
- 所有普通对象默认继承自
Object.prototype,所以能用toString()、hasOwnProperty()等方法——这是最基础的委托示例 - 函数的
prototype属性,只对用new调用时才作为新实例的原型;直接设置obj.__proto__ = otherObj是更直观的委托方式
手动建立委托关系(推荐用 Object.setPrototypeOf)
避免直接修改 __proto__(非标准且影响性能),改用标准 API:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const animal = {
speak() {
return `I'm ${this.name} and I make a sound.`;
}
};
const dog = { name: 'Buddy' };
Object.setPrototypeOf(dog, animal); // dog 委托给 animal
console.log(dog.speak()); // "I'm Buddy and I make a sound."
-
dog自身没有speak,但通过原型链找到animal.speak -
this在speak中仍指向dog,所以this.name正确取到'Buddy'
用构造函数 + prototype 实现批量委托
适合创建多个具有相同行为委托关系的对象:
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
return `I'm ${this.name} and I make a sound.`;
};
function Dog(name, breed) {
Animal.call(this, name); // 借用构造函数初始化 own properties
this.breed = breed;
}
// 关键:让 Dog.prototype 委托给 Animal.prototype
Object.setPrototypeOf(Dog.prototype, Animal.prototype);
const myDog = new Dog('Max', 'Golden Retriever');
console.log(myDog.speak()); // "I'm Max and I make a sound."
-
Dog.prototype不包含speak,但它的[[Prototype]]是Animal.prototype,因此可委托调用 - 注意:不要写
Dog.prototype = Animal.prototype(会共享引用,污染父类原型)
现代替代方案:Object.create 更清晰表达委托意图
显式创建以某对象为原型的新对象,语义更纯粹:
const animal = {
eat() { return `${this.name} is eating.`; }
};
const cat = Object.create(animal);
cat.name = 'Luna';
console.log(cat.eat()); // "Luna is eating."
console.log(Object.getPrototypeOf(cat) === animal); // true
-
Object.create(animal)直接返回一个原型为animal的空对象 - 比
new Object()+setPrototypeOf更轻量、意图更明确
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










