reflect.getownpropertydescriptor用于获取对象自身属性的完整描述符,返回含value/writable/enumerable/configurable或get/set等字段的对象;属性不存在时返回undefined,不查原型链,且对非对象参数抛typeerror。

<p><strong>Reflect.getOwnPropertyDescriptor</strong> 用于获取对象自身某个属性的完整描述符(descriptor),返回一个包含 <code>value</code>、<code>writable</code>、<code>enumerable</code>、<code>configurable</code> 等属性的对象;如果属性不存在或为继承属性,则返回 <code>undefined</code>。</p> <h3>基本用法:传入对象和属性名</h3> <p>语法很简单:<code>Reflect.getOwnPropertyDescriptor(obj, prop)</code>。第一个参数是目标对象,第二个是字符串形式的属性名。</p>
- 只查**自身属性**,不查原型链上的属性(这点和
Object.getOwnPropertyDescriptor一致) - 返回值是 descriptor 对象(含
value/get/set等字段),或undefined - 比如:
Reflect.getOwnPropertyDescriptor({a: 1}, 'a')返回{value: 1, writable: true, enumerable: true, configurable: true}
区分数据属性和访问器属性
返回的描述符结构取决于属性类型:
- 数据属性(普通赋值创建):包含
value和writable - 访问器属性(用
get/set定义):包含get和set(可能为undefined),不含value/writable - 例如:
const obj = {get x() { return 42; }};→Reflect.getOwnPropertyDescriptor(obj, 'x')返回{get: f, set: undefined, enumerable: true, configurable: true}
注意 null/undefined 和不可枚举属性
该方法对非对象参数会抛出 TypeError,且对不可枚举属性仍能正常获取描述符(只要它是自身的)。
- 不能传
null或undefined,否则报错:Reflect.getOwnPropertyDescriptor(null, 'x')→TypeError - 即使属性
enumerable: false,也能查到,比如Object.defineProperty(obj, 'hidden', {value: 1, enumerable: false}) - 但若属性在原型上(如
toString),返回undefined—— 需先用Object.getPrototypeOf找到对应原型再查
和 Object.getOwnPropertyDescriptor 的区别
两者行为几乎完全一致,主要差异在返回值类型和调用方式:
-
Object.getOwnPropertyDescriptor在参数非法时可能静默返回undefined(如传原始值),而Reflect.getOwnPropertyDescriptor统一严格校验并抛错 -
Reflect方法设计为更“函数式”,适合搭配 Proxy handler 或元编程场景 - 日常使用中可互换,但推荐用
Reflect版本,语义更清晰、错误更明确











