javascript原型链通过构造函数的prototype共享方法,实例通过[[prototype]]链查找调用;可动态扩展prototype实现运行时增强;子类用object.create(parent.prototype)继承并可覆盖父方法。

JavaScript 中用原型链实现对象的行为扩展,核心是把方法定义在构造函数的 prototype 上,让所有实例共享这些方法,同时利用原型链的向上查找机制实现行为复用与扩展。
把方法挂到 prototype 上,让实例自动继承
构造函数本身不存储方法,而是通过其 prototype 对象统一提供行为。实例创建后,内部的 [[Prototype]](可通过 __proto__ 访问)会指向该构造函数的 prototype,从而能调用上面的方法。
例如:
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + ' makes a sound');
};
const dog = new Animal('Buddy');
dog.speak(); // "Buddy makes a sound"
这里 dog.speak() 能执行,是因为 dog.__proto__ === Animal.prototype,引擎沿原型链找到了 speak 方法。
通过修改 prototype 实现运行时扩展
由于所有实例共享同一个 prototype,往它上面添加新方法,已有实例也能立即使用——这是动态扩展的关键。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 给已有构造函数追加功能,无需改动原有实例
- 适合插件式增强、Polyfill 或调试时临时注入方法
比如后续为 Animal 增加奔跑能力:
Animal.prototype.run = function(speed = 'fast') {
console.log(this.name + ' runs ' + speed);
};
dog.run(); // "Buddy runs fast"
用原型链实现继承:子类复用父类行为
要让一个类型“扩展”另一个类型的行为,常见做法是让子构造函数的 prototype 指向父类的一个实例(或用 Object.create(Parent.prototype)),再修正 constructor 指针。
例如让 Dog 继承 Animal 并扩展专属方法:
function Dog(name, breed) {
Animal.call(this, name); // 借用父类构造逻辑
this.breed = breed;
}
// 关键:建立原型链
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// 扩展自己的方法
Dog.prototype.bark = function() {
console.log(this.name + ' barks loudly!');
};
const myDog = new Dog('Max', 'Golden Retriever');
myDog.speak(); // ✅ 来自 Animal.prototype
myDog.bark(); // ✅ 来自 Dog.prototype
注意原型链查找的顺序和覆盖逻辑
方法调用时,JS 引擎从实例自身开始查找,找不到就沿 __proto__ 向上逐级搜索,直到 null。这意味着:
- 实例自身定义的方法会屏蔽原型上的同名方法
- 子类可重写父类方法(即“覆盖”),只需在子类
prototype上定义同名函数 - 若需在子类方法中调用父类同名方法,可用
Parent.prototype.method.call(this, ...)
例如重写 speak 并保留父类逻辑:
Dog.prototype.speak = function() {
Animal.prototype.speak.call(this); // 先执行父类逻辑
console.log(this.name + ' barks instead!');
};
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










