reflect 无法获取属性详细信息,应使用 object.getownpropertydescriptor(单个属性)或 object.getownpropertydescriptors(所有自有属性);reflect.ownkeys 可配合前者批量获取描述符。

在 JavaScript 中,Reflect 本身并不直接提供“获取对象属性详细信息”(如是否可枚举、是否可配置、是否可写等)的能力。它主要用于统一操作对象的底层行为(如 get、set、ownKeys、defineProperty 等),但**不替代 Object.getOwnPropertyDescriptor 或 Object.getOwnPropertyDescriptors** —— 这些才是获取属性描述符(即详细元信息)的标准方法。
要获取单个属性的详细信息:用 Object.getOwnPropertyDescriptor
这是最直接的方式,返回指定属性的描述符对象(包含 value、writable、enumerable、configurable 等字段):
- 只对自有属性(own property)有效,不查找原型链上的属性
- 若属性不存在或为继承属性,返回
undefined - 适用于数据属性和访问器属性(
get/set)
示例:
const obj = { a: 1 };Object.defineProperty(obj, 'b', {
get() { return 2; },
enumerable: false,
configurable: true
});
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
// { value: 1, writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(obj, 'b'));
// { get: [Function], enumerable: false, configurable: true }
要获取所有自有属性的详细信息:用 Object.getOwnPropertyDescriptors
一次性返回对象所有自有属性的描述符,结果是键值对形式的对象,每个值都是一个属性描述符:
- 比多次调用
getOwnPropertyDescriptor更高效 - 常用于安全地复制属性特性(比如配合
Object.defineProperties实现深拷贝或 mixin) - 不会包含原型链上的属性
示例:
const source = { x: 1 };Object.defineProperty(source, 'y', {
value: 2,
writable: false
});
const descriptors = Object.getOwnPropertyDescriptors(source);
console.log(descriptors);
// { x: { value: 1, writable: true, enumerable: true, configurable: true },
// y: { value: 2, writable: false, enumerable: true, configurable: true } }
Reflect 的相关能力:间接辅助获取信息
Reflect 不提供描述符查询,但它有若干方法可用于探测或操作属性,可作为补充:
-
Reflect.has(obj, key)→ 类似key in obj,判断属性是否存在(含继承) -
Reflect.ownKeys(obj)→ 返回所有自有属性键(包括不可枚举、Symbol),比Object.keys和Object.getOwnPropertyNames更完整 -
Reflect.getOwnPropertyDescriptor?→ 不存在。这是常见误解,Reflect没有该方法
你可以组合使用:Reflect.ownKeys(obj) 获取全部键,再对每个键调用 Object.getOwnPropertyDescriptor(obj, key) 来批量获取描述符。
注意原型链与属性来源的区别
属性信息取决于你查的是“自有属性”还是“可访问属性”:
-
Object.getOwnPropertyDescriptor和getOwnPropertyDescriptors只看对象自身 - 想检查某个属性是否在原型链上可读/可写,需手动遍历原型链(用
Object.getPrototypeOf)并逐层调用getOwnPropertyDescriptor -
Reflect.get或obj.prop是运行时访问行为,不暴露元信息











