构造函数初始化独有数据,原型挂载共享方法;避免属性共享污染与函数重复创建;动态原型和冻结优化提升健壮性与性能。

核心是把“每个实例都要有、但内容各不相同”的数据,放在构造函数里初始化;把“所有实例都一样、只用一份”的行为,统一挂到原型上。这样既避免属性被共享污染,又省掉重复创建函数的开销。
构造函数负责独有数据
姓名、ID、配置对象、内部状态数组等——只要不同实例之间不能互相影响,就必须在构造函数中用 this 赋值。
- ✅ 正确写法:
this.name = name;、this.items = [];、this.config = { timeout: 5000 }; - ❌ 错误写法:在
Constructor.prototype上定义items: []或config: {}—— 所有实例会共用同一个数组或对象,一改全改
原型承载通用方法
像 render()、validate()、toString() 这类逻辑固定、无需每实例一份的函数,全放到 prototype 上。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 所有实例通过原型链调用同一份函数体,内存只占一次
- 方法内部仍用
this.xxx访问实例自己的属性,确保数据与行为正确绑定 - 可加
Object.freeze(Constructor.prototype)防止运行时被意外覆盖
动态原型模式提升健壮性
不依赖外部手动设置 prototype,而是在首次实例化时检查方法是否存在,不存在就一次性挂载。
- 示例:
if (typeof this.sayHello !== 'function') { Person.prototype.sayHello = function() { ... }; } - 好处:构造逻辑集中,不影响已有实例,也不怕 prototype 被重赋值切断链路
缓存+冻结优化字典类场景
对状态码、枚举项这类只读结构,可用 Map 缓存已创建的实例,并在创建后立即 Object.freeze()。
- 例如:
STATUS_MAP.get('SUCCESS')总返回同一个冻结对象 - 实例自身只存字段(如
code、label),方法全来自冻结的原型 - 兼顾单例语义、查找性能和不可变安全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










