应将共用方法挂到构造函数的prototype上以实现共享复用;因在构造函数内定义方法会导致每实例化一次就新建一个函数副本,造成内存浪费、无法统一更新且违背行为复用原则。

把共用方法统一挂到构造函数的 prototype 上,让所有实例通过原型链共享同一份函数,而不是每次创建实例都新建一份。
为什么重复定义方法会浪费内存
如果在构造函数内部定义方法,每 new 一个实例,就会生成一个独立的函数副本。100 个实例就有 100 个 sayHello 函数,不仅占用大量堆内存,还无法真正复用逻辑。
- 函数是引用类型,重复创建等于重复分配内存空间
- 实例间方法无法共享,修改一处不影响其他实例
- 违背“行为复用”的设计初衷,增加 GC 压力
正确做法:方法统一放在 prototype 上
构造函数只负责初始化实例属性,公共方法全部交给 prototype 管理。实例访问方法时,引擎自动沿 __proto__ → prototype 查找。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 所有实例共享 prototype 上的方法,只存一份代码
- 新增方法可即时生效,已存在的实例也能调用
- 符合 JavaScript 原型机制的设计本意:轻量、动态、节省资源
实际写法示例
对比两种写法:
❌ 错误(内存浪费):function User(name) {
this.name = name;
// 每次 new 都新建一个函数
this.greet = function() {
return `Hi, ${this.name}`;
};
}
✅ 正确(共享复用):
function User(name) {
this.name = name;
}
// 只定义一次,所有实例都能用
User.prototype.greet = function() {
return `Hi, ${this.name}`;
};
进阶注意点
避免把需要隔离的数据(如缓存、状态)也放在 prototype 上,否则所有实例共用同一份数据。
- 方法放 prototype,实例独有数据放 this 上
- 子类继承时,可用
Object.create(Parent.prototype)设置原型链,复用父类方法 - 现代开发中 class 语法本质仍是原型链,
class A { method() {} }等价于挂到 A.prototype
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










