javascript用原型链实现方法复用,核心是将共用方法定义在构造函数的prototype上,使所有实例共享该方法、节省内存;若在构造函数内定义方法则每次实例化都重复创建,造成浪费;原型链还支持动态扩展、继承及分层复用。

JavaScript 中用原型链实现对象方法复用,核心是把共用的方法定义在构造函数的 prototype 上,让所有实例共享该方法,避免重复创建函数、节省内存。
把方法挂到 prototype 上
构造函数本身不包含方法体,而是通过其 prototype 属性添加方法。所有通过该构造函数创建的实例,都能通过原型链访问这些方法。
例如:
function Person(name, age) {
this.name = name;
this.age = age;
}
// 方法写在 prototype 上,而非构造函数内部
Person.prototype.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
};
const p1 = new Person('Alice', 25);
const p2 = new Person('Bob', 30);
p1.sayHello(); // Hello, I'm Alice
p2.sayHello(); // Hello, I'm Bob
此时 p1 和 p2 都没有自己的 sayHello 方法,但能调用,是因为 JavaScript 在访问属性时会沿着原型链向上查找——先查实例自身,再查 Person.prototype,最后到 Object.prototype。
避免在构造函数里重复创建函数
如果把方法写在构造函数内部(即每次实例化都新建一个函数),会造成内存浪费且无法真正“复用”:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
function BadPerson(name) {
this.name = name;
// ❌ 每次 new 都新建一个函数,地址不同,不共享
this.sayHello = function() {
console.log(`Hello, I'm ${this.name}`);
};
}
这样每个实例都有独立的 sayHello 函数副本,既占内存,也无法通过修改原型统一更新行为。
支持动态扩展和继承复用
原型链天然支持运行时扩展:给 prototype 新增方法,已有实例立刻可用。
- 新增方法后,旧实例也能调用
- 子类可通过
Object.setPrototypeOf(Child.prototype, Parent.prototype)或class Child extends Parent继承父类原型上的方法 - 多个构造函数可共享同一原型对象(需谨慎,通常用
Object.create(Parent.prototype)更安全)
注意 constructor 指针和原型替换
直接赋值 Child.prototype = Parent.prototype 会破坏 constructor 指向,也影响后续扩展。推荐方式:
// ✅ 正确继承原型链
function Animal(name) { this.name = name; }
Animal.prototype.eat = function() { console.log(`${this.name} is eating`); };
function Dog(name, breed) {
Animal.call(this, name);
this.breed = breed;
}
// 使用 Object.create 建立原型链
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修复 constructor
Dog.prototype.bark = function() { console.log('Woof!'); };
const d = new Dog('Max', 'Golden');
d.eat(); // Max is eating ← 复用 Animal.prototype.eat
d.bark(); // Woof!
这样 Dog 实例既能复用 Animal 的方法,又能拥有自己的方法,真正实现分层复用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










