原型链本身不直接构建对象池,但为高性能对象池提供底层支撑——通过object.create实现纯净原型指向、零初始化延迟复用、实例状态隔离及最短原型链(实例→原型→null)。

原型链本身不直接“构建”对象池,但它为高性能对象池提供了底层支撑机制——尤其是 Object.create 所依赖的纯净原型指向能力。真正起作用的是:用原型隔离实例状态、避免构造函数开销、实现零初始化延迟复用。
用 Object.create 实现按需实例化
对象池不预创建实例,只存原型引用。每次 get() 时才调用 Object.create(proto),生成一个干净对象,其 __proto__ 直接指向指定原型,不执行构造函数、无 this 绑定、无临时属性污染。这样既节省内存,又保证每次拿到的都是结构一致、原型链最短的实例。
- 池内部用 Map 存储:
Map<prototype array>></prototype>,键是原型对象本身(非字符串),避免类型混淆 - 首次获取时 create,后续从数组 pop 复用,LIFO 提升缓存命中率
- 实例自身不挂业务数据,所有共享逻辑(如 reset 方法)定义在原型上
原型必须冻结且只含不可变/纯函数
原型对象是所有复用实例的统一源头,一旦被意外修改,所有实例行为都会改变。因此原型应提前冻结:
- 调用
Object.freeze(proto),禁止添加、删除、修改属性 - 只在原型上放方法和常量(如
DEFAULT_X = 0),不放可变引用(如空数组、空对象) - 若需初始状态,由实例自己在 reset 中赋值(
this.position = {x:0,y:0}),而非从原型继承
reset 是复用契约的核心
归还对象前必须重置状态,否则残留数据会污染下一次使用。这个 reset 必须由业务层实现,并放在原型上供所有实例调用:
- reset 要清空所有自有属性(
this.isAlive = false)、重置数值、切断外部引用(this.callback = null) - 不建议用
for...in或Object.assign({}, ...)浅拷贝,易漏 Symbol 键或不可枚举属性 - 若对象嵌套其他池化对象(如 Vec2),reset 应递归调用其归还逻辑,而非 new 重建
严格校验归还一致性
put(instance) 不接受任意对象。必须确保该实例的原型与池管理的原型完全一致:
- 检查
Object.getPrototypeOf(instance) === proto,而非仅比对 constructor - 拒绝带有 constructor 属性的实例(类实例通常有),防止混入不可控初始化逻辑
- 归还前执行
instance.reset?.(),再 push 到对应原型的复用数组
这套设计把原型链从“继承工具”转为“模板协议”,让对象池轻量、可控、可预测。性能提升来自三处:无构造开销、原型链最短(实例 → 原型 → null)、复用局部性高(pop/push 数组栈)。关键不在链多长,而在链够干净。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











