Reflect 本身不能直接获取不可枚举属性,需结合 Reflect.ownKeys() 获取所有自有属性键,再通过 Object.getOwnPropertyDescriptor 判断每个键的 enumerable 是否为 false 来筛选。

Reflect 本身不能直接获取不可枚举属性。 它没有类似 Reflect.getOwnPropertyNames() 或 Reflect.ownKeys() 的方法来专门筛选“不可枚举”的属性——这些方法返回的是所有自有属性(包括不可枚举的),但不会区分枚举性。要获取“不可枚举属性”,你需要结合其他 API 过滤。
用 Reflect.ownKeys() 获取所有自有属性键
Reflect.ownKeys(target) 返回对象所有自有属性的键(包括字符串和 Symbol),无论是否可枚举、是否为不可枚举属性,也包含不可枚举的 Symbol 属性。
- 它覆盖了
Object.getOwnPropertyNames()+Object.getOwnPropertySymbols()的全部结果 - 但不提供属性描述符,所以无法直接知道某个键是否不可枚举
配合 Object.getOwnPropertyDescriptor 判断枚举性
对每个键调用 Object.getOwnPropertyDescriptor(obj, key),检查返回描述符中的 enumerable: false:
- 如果描述符存在且
enumerable为false,就是不可枚举属性 - 注意:访问器属性(get/set)也可能不可枚举,同样适用该判断
- 普通数据属性若没显式设置
enumerable,默认为false(如通过Object.defineProperty添加时未指定)
实际获取不可枚举属性的写法
组合使用 Reflect.ownKeys() 和描述符检查:
立即学习“Java免费学习笔记(深入)”;
function getNonEnumerableKeys(obj) {
return Reflect.ownKeys(obj).filter(key => {
const desc = Object.getOwnPropertyDescriptor(obj, key);
return desc && !desc.enumerable;
});
}
// 示例
const obj = {};
Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false });
obj.normal = 123;
console.log(getNonEnumerableKeys(obj)); // ['hidden']
注意边界情况
以下情况需额外留意:
-
undefined或null会报错,调用前应校验 - 原型链上的不可枚举属性不会被
Reflect.ownKeys()捕获,它只查自有属性 - 某些内置对象(如
Array.prototype)有不可枚举方法(如values),可用同样方式提取


















