在构造函数中直接为this添加方法会导致每个实例都创建独立函数对象,造成内存浪费;而定义在prototype上的方法被所有实例共享,仅存一份,显著节省内存。

把方法定义在原型对象上,能让所有实例共享同一份函数代码,避免每个实例都单独保存一份副本,从而显著减少内存占用。
为什么实例方法会浪费内存
如果在构造函数里直接给 this 添加方法,每次创建新实例时,都会生成一个全新函数对象:
function Person(name) {
this.name = name;
// ❌ 每个实例都新建一个 sayHello 函数
this.sayHello = function() {
console.log('Hello, ' + this.name);
};
}
const p1 = new Person('Alice');
const p2 = new Person('Bob');
console.log(p1.sayHello === p2.sayHello); // false —— 两个不同函数对象
这种写法让 n 个实例就占用 n 份相同的函数内存,尤其在大量对象场景下开销明显。
把方法移到 prototype 上
把函数定义在构造函数的 prototype 属性上,所有实例通过原型链访问同一个函数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function Person(name) {
this.name = name;
}
// ✅ 所有实例共享同一个 sayHello
Person.prototype.sayHello = function() {
console.log('Hello, ' + this.name);
};
const p1 = new Person('Alice');
const p2 = new Person('Bob');
console.log(p1.sayHello === p2.sayHello); // true —— 同一个函数引用
此时函数只在内存中存在一份,无论创建多少实例都不额外增加函数对象内存。
哪些内容适合放 prototype
- 所有不依赖闭包、不需访问构造函数内部私有变量的通用方法
- 需要被子类继承或重写的成员方法
- 不会因实例状态而改变行为的逻辑(比如格式化、计算、事件处理等)
- 避免在 prototype 上放引用类型值(如数组、对象),否则多个实例会共享同一份数据
现代替代方案:class 语法更清晰
ES6 的 class 默认就把方法定义在原型上,语义更明确:
class Person {
constructor(name) {
this.name = name;
}
// ✅ 自动挂载到 Person.prototype
sayHello() {
console.log('Hello, ' + this.name);
}
}
它本质仍是基于原型的实现,只是语法糖,同样具备共享函数、节省内存的优点。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










