将方法绑定到构造函数的 prototype 上可节省内存,因为实例共享同一函数引用;若在构造函数内定义方法,则每个实例都会重复创建函数,造成冗余。

把方法绑定到构造函数的 prototype 上,就能节省内存空间。
为什么直接在构造函数里定义方法会浪费内存
每次用 new 创建实例时,如果方法写在构造函数内部(比如 this.sayHello = function() {...}),JavaScript 就会为每个实例单独创建一份该函数,占用多份内存。
- 100 个实例 → 100 份相同的函数代码
- 函数是引用类型,重复创建毫无必要
- 尤其在大量对象场景下,内存开销明显
正确做法:方法统一挂载到 prototype
将不依赖实例私有数据的通用方法,定义在构造函数的 prototype 属性上。所有实例通过原型链共享同一个函数引用。
Person.prototype.sayHello = function() { console.log(`Hi, I'm ${this.name}`); };- 此时
person1.sayHello === person2.sayHello返回 true - 只在内存中保存一份函数,无论创建多少实例
哪些方法适合放 prototype,哪些不适合
判断依据是:是否需要访问构造函数内部的闭包变量或私有状态。
- ✅ 适合放 prototype:操作
this上的公开属性(如name、age)的方法 - ❌ 不适合放 prototype:依赖局部变量、闭包内函数、或需封装私有逻辑的方法(这类可保留在构造函数内,或改用 ES6 的
#private字段)
补充:现代替代方案(ES6+)
使用 class 语法更直观,但底层仍是 prototype 绑定:
class Person { constructor(name) { this.name = name; } sayHello() { console.log(`Hi, I'm ${this.name}`); } }- 编译后,
sayHello自动添加到Person.prototype - 效果和手动写
Person.prototype.sayHello完全一致











