应将方法和不可变数据放原型上以共享,避免实例重复创建;不可变值(如函数、字符串)可安全共享,可变对象需实例私有化;高频小对象可用享元模式分离不变配置与可变状态。

把方法和可共享数据放到原型上,而不是每个实例里重复创建。
把方法定义在 prototype 上
每次用 new 创建实例时,如果把方法写在构造函数内部,每个实例都会拥有独立的一份函数副本,浪费内存。改用原型共享,所有实例共用同一份方法。
- ❌ 错误写法(每个实例都复制一份):
function Person(name) {
this.name = name;
this.sayHi = function() { console.log('Hi ' + this.name); };
} - ✅ 正确写法(共用一个函数):
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() { console.log('Hi ' + this.name); };
避免在原型上放可变对象
原型上的属性是共享的,如果放数组、对象等引用类型,所有实例会共用同一个,修改一个就影响全部。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ❌ 危险示例:
Person.prototype.hobbies = []; —— 添加爱好会污染其他实例 - ✅ 安全做法:
只在原型上放不可变值(如字符串、数字、函数),或让实例自己初始化自己的可变状态:
Person.prototype.getHobbies = function() { return this._hobbies || (this._hobbies = []); };
结合享元模式处理高频小对象
当需要成百上千个轻量级对象(比如游戏中的子弹、图表中的点),可以进一步用享元思想:把不变的配置(如颜色、尺寸、默认行为)抽到原型或共享池中,实例只保留变化的部分(如坐标、状态)。
- 例如:
const bulletFlyweight = { speed: 10, damage: 5, sprite: 'bullet.png' };
function Bullet(x, y) {
this.x = x;
this.y = y;
// 不重复存 flyweight 数据
}
Bullet.prototype.render = function() {
drawImage(bulletFlyweight.sprite, this.x, this.y);
};
注意原型链查找开销与缓存权衡
访问原型上的属性或方法比访问实例自身略慢(需向上遍历),但现代引擎已高度优化,这点开销远小于重复创建函数或对象的内存代价。只要不滥用深层嵌套原型链(比如手动链式设置 __proto__),性能完全可控。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










