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