私有字段(#field)在 javascript 中性能几乎无额外开销,是编译期固化访问路径的原生机制,内存占用与公有字段相近,访问速度快、gc 轻量、无反射干扰,性能瓶颈源于封装方式而非 # 本身。

私有字段(#field)在 JavaScript 中几乎没有额外性能开销,它不是靠运行时拦截或代理实现的,而是由引擎在编译阶段就固化访问路径的原生机制。
内存占用几乎与公有字段持平
V8 引擎将 #field 和 this.field 都作为对象内部槽位(internal slot)存储,基础结构开销相近——约 8 字节 + 值本身所占空间。它不创建额外的作用域对象,也不拖拽词法环境,这点和闭包方案有本质区别。
- 多个实例共享同一隐藏类(hidden class)结构,仅数据分离,内存紧凑
- Heap Snapshot 中表现为标准 Object,无 Closure 节点堆积
- 实测 10 万个实例下,比闭包方案节省约 3–4 MB 堆内存
访问速度接近普通属性
引擎可在类定义时确定私有字段的内存偏移量,无需动态查找、代理拦截或原型链遍历:
-
this.#value编译后直接映射到固定槽位,支持内联缓存(IC)快速命中 - 不参与
for...in、Reflect.ownKeys()等反射操作,省去过滤开销 - 没有 WeakMap 或闭包带来的引用管理负担,GC 更轻量、更及时
没有运行时安全检查成本
私有性由语法层强制,在解析阶段就报错(SyntaxError),不依赖运行时权限校验:
- 不像 Java 的
setAccessible(true),不存在反射解锁的性能损耗 - 无法被
JSON.stringify()、Object.keys()探测,也无需做存在性判断 - 异步方法中使用
await不影响访问效率,控制流恢复后仍是直接槽位读写
真正影响性能的是用法,不是 # 本身
所谓“开销”往往来自封装方式的选择,而非 # 修饰符:
- 用闭包模拟私有状态 → 每个实例生成独立 Context,内存放大、GC 困难
- 用
WeakMap存私有数据 → 额外 Map 对象、哈希查找、键引用管理 - 用
#field→ 字段直存实例,结构清晰,引擎友好











