将方法挂载到构造函数的 prototype 上,可让所有实例共享同一份函数代码,避免每次 new 时重复创建函数对象而浪费内存;实例仅保存自有属性,方法统一存于 prototype,通过 proto 链访问,支持覆盖与回退机制。

把方法挂到构造函数的 prototype 上,让所有实例共享同一份函数代码,是优化 JavaScript 内存分配最直接有效的方式。
只在 prototype 上定义方法,别写进构造函数
每次用 new 创建实例时,如果方法定义在构造函数内部,就会为每个实例重新生成一份函数对象,白白占用堆内存。移到 prototype 后,函数只存一份,所有实例通过 __proto__ 链访问它。
- ❌ 浪费内存:
function Person(name) { this.name = name; this.say = function() { console.log(this.name); }; } - ✅ 正确做法:
function Person(name) { this.name = name; } Person.prototype.say = function() { console.log(this.name); }; - 验证方式:
new Person('a').say === new Person('b').say返回true,说明指向同一个函数对象
区分“自有属性”和“原型属性”的存储位置
实例对象自身只保存自己独有的数据(比如 this.age = 25),而方法、通用配置等不随实例变化的内容,全放在 Person.prototype 里。这样堆中不会重复复制,节省大量空间。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 实例对象内存:仅含
age、name等自有属性 - prototype 对象内存:独立存在,含
say、constructor等共享成员 - 访问逻辑:查不到自有属性时,自动沿
__proto__向上找,直到Object.prototype或null
善用“就近优先 + 共享后备”机制
这个机制天然支持灵活覆盖与回退:你可以在实例上临时加一个同名方法来覆盖原型行为,删掉后又自动恢复原型版本,不用额外管理。
立即学习“Java免费学习笔记(深入)”;
- 覆盖:
p1.say = function() { console.log('custom'); },调用时走实例自己的 - 回退:
delete p1.say后,p1.say()自动回到Person.prototype.say - 强制调原型:
Person.prototype.say.call(p1),绕过实例遮蔽
避免字面量对象替代构造函数模式
像 const obj = { say() { ... } } 这种写法,所有属性都属于自身,无法被其他对象共享。需要多个相似对象时,不如用构造函数 + prototype 模式——它是为复用设计的模板结构。
- 字面量对象:
__proto__直接指向Object.prototype,无共享基础 - 构造函数实例:
__proto__指向专属prototype,天然支持方法集中管理 - 优势明显:方法越多、实例越多,内存节省越显著

















