JavaScript中不存在真正私有属性,不可枚举属性可通过Object.getOwnPropertyNames()、Object.getOwnPropertyDescriptors()或Reflect.ownKeys()访问,但类私有字段(#)和WeakMap封装的状态无法被任何标准API访问。

JavaScript 中没有真正意义上的“私有属性”,所谓不可枚举的属性(如通过 Object.defineProperty 设置 enumerable: false 的属性)并非私有,只是不会出现在 for...in、Object.keys() 等默认遍历中。要访问这类属性,关键在于知道属性名或借助特定反射 API。
使用 Object.getOwnPropertyNames() 获取所有自有属性名
该方法返回对象自身所有属性名(包括不可枚举的),但不包括继承属性和 Symbol 属性。
- 适用于已知属性存在于目标对象自身(非原型链)且为字符串键的情况
- 配合
Object.getOwnPropertyDescriptor()可进一步读取属性描述符(如value、get函数等) - 示例:
Object.getOwnPropertyNames(obj)会返回['hidden', 'name'],即使hidden不可枚举
使用 Object.getOwnPropertyDescriptors() 获取完整描述信息
一次性获取所有自有属性的完整描述符对象,包含 value、get、set、enumerable、configurable、writable 等字段。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 适合需要判断或操作属性特性(比如是否只读、是否可配置)的场景
- 能安全读取 getter 属性的返回值(直接访问可能触发副作用,需谨慎)
- 注意:对 getter 属性调用
descriptor.get?.call(obj)才能获取其值
结合 Reflect.ownKeys() 覆盖 Symbol 和字符串键
该方法返回对象所有自有属性键(包括不可枚举的字符串键 + 所有 Symbol 键),是目前最全面的自有键获取方式。
立即学习“Java免费学习笔记(深入)”;
- 比
Object.getOwnPropertyNames()多出 Symbol 类型键 - 仍不包含继承属性;若需原型链上的不可枚举属性,需手动遍历原型链(如用
Object.getPrototypeOf()循环) - 拿到键后,可用
obj[key]或Object.getOwnPropertyDescriptor(obj, key)访问值或描述符
无法绕过“真私有”——# 字段与 WeakMap
ES2022 起的类私有字段(#name)和闭包/WeakMap 实现的私有状态,**无法通过任何标准反射 API 访问**。
-
Object.getOwnPropertyNames()、Reflect.ownKeys()等均不返回#开头的字段名 - 这是语言级封装,设计目的就是防止外部探测和篡改
- 试图通过调试器或 V8 内部机制访问属于未定义行为,不应在生产代码中依赖

















