javascript用原型链实现方法复用,核心是将共用方法定义在构造函数的prototype上,使所有实例共享该方法而非重复创建;实例属性存状态,原型方法操作状态,既隔离数据又复用逻辑。

JavaScript 中用原型链实现方法复用,核心是把共用的方法定义在构造函数的 prototype 上,让所有实例共享该方法,避免重复创建函数对象。
把方法挂到 prototype 上
构造函数本身只负责初始化实例属性,而通用行为(如计算、格式化、交互逻辑)应统一放在原型对象中。这样每个实例不再单独保存一份函数,而是通过隐式原型(__proto__)向上查找。
例如:
function Person(name, age) {
this.name = name;
this.age = age;
}
<p>// 复用的方法:定义在 prototype 上
Person.prototype.sayHello = function() {
return <code>Hello, I'm ${this.name}</code>;
};</p><p>Person.prototype.getAgeGroup = function() {
if (this.age </p><p>const p1 = new Person('Alice', 25);
const p2 = new Person('Bob', 17);</p><p>console.log(p1.sayHello()); // "Hello, I'm Alice"
console.log(p2.getAgeGroup()); // "teenager"
console.log(p1.sayHello === p2.sayHello); // true —— 同一个函数引用</p>理解原型链的查找机制
当调用 p1.sayHello() 时,JS 引擎按如下顺序查找:
- 先在
p1自身属性中找sayHello(没找到) - 接着查
p1.__proto__,即Person.prototype(找到了) - 执行该方法,且其中的
this指向p1
这个“向上委托”的过程就是原型链。只要方法在原型链上某一级存在,就能被所有后代实例调用。
注意 constructor 的指向问题
直接赋值 prototype 会覆盖默认的 constructor,导致实例的 constructor 指向 Object 而非原构造函数。需手动修复:
Person.prototype = {
constructor: Person, // 显式恢复
sayHello() { /* ... */ },
getAgeGroup() { /* ... */ }
};
或者更稳妥地用 Object.assign 扩展原型,而非完全替换:
Object.assign(Person.prototype, {
sayHello() { /* ... */ },
getAgeGroup() { /* ... */ }
});
组合使用:原型方法 + 实例属性
典型模式是:实例属性存状态(如 name、id),原型方法操作这些状态。这样既保证数据隔离,又实现逻辑复用。
比如多个 Button 实例各自有 disabled 状态,但都复用同一个 toggle() 方法:
function Button(text) {
this.text = text;
this.disabled = false;
}
<p>Button.prototype.toggle = function() {
this.disabled = !this.disabled;
return this; // 支持链式调用
};</p><p>const btn1 = new Button('Save');
const btn2 = new Button('Cancel');</p><p>btn1.toggle(); // btn1.disabled 变为 true
btn2.toggle(); // btn2.disabled 变为 true —— 独立状态,共享逻辑</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











