Object.getOwnPropertyDescriptor()用于获取对象自有属性的描述符,返回含value/writable或get/set等字段的对象,不查找原型链;若属性不存在或非自有则返回undefined。

Object.getOwnPropertyDescriptor() 是 JavaScript 中用于获取对象自身属性的完整描述符(descriptor)的方法。它只检查对象自身的属性,不查找原型链上的属性。
基本用法和返回值结构
调用方式为 Object.getOwnPropertyDescriptor(obj, prop),其中 obj 是目标对象,prop 是要查询的属性名(字符串)。如果属性存在且是自有属性,返回一个描述符对象;否则返回 undefined。
返回的描述符对象包含以下可能字段:
- value:属性的值(仅适用于数据属性)
- writable:是否可写(仅适用于数据属性)
- get:getter 函数(仅适用于访问器属性)
- set:setter 函数(仅适用于访问器属性)
-
enumerable:是否可在
for...in或Object.keys()中枚举 - configurable:是否可删除、是否可修改其他描述符特性
区分数据属性和访问器属性
描述符类型由返回对象中是否含 get/set 决定:
立即学习“Java免费学习笔记(深入)”;
- 含
get或set→ 访问器属性(accessor property)→ 此时不含value和writable - 含
value和writable→ 数据属性(data property)→ 此时不含get和set
例如:const obj = { a: 1 };Object.getOwnPropertyDescriptor(obj, 'a') 返回 { value: 1, writable: true, enumerable: true, configurable: true }
注意不可枚举和继承属性不会被返回
getOwnPropertyDescriptor 不会返回原型链上的属性,即使该属性可枚举也不行。例如:
-
{}.hasOwnProperty('toString')是true,但Object.getOwnPropertyDescriptor({}, 'toString')返回undefined,因为toString在Object.prototype上,不是空对象自身的属性 - 使用
Object.defineProperty设置enumerable: false的属性仍能被该方法获取,只要它是对象自身的
配合 defineProperty 修改属性特性
获取描述符后,常配合 Object.defineProperty() 或 Object.defineProperties() 进行重定义。注意:
- 若原属性 configurable: false,则不能把 configurable 或 enumerable 改为 true,也不能把 writable: false 改为 true(除非原本是 value 属性且未冻结)
- 修改 get/set 需确保目标是访问器属性,且 configurable 允许变更


















