Object.getOwnPropertyDescriptor 返回对象自身属性的完整描述符,包含 value/writable(数据属性)或 get/set(访问器属性)等字段,用于判断可写性、可枚举性、可配置性及属性类型。

Object.getOwnPropertyDescriptor 是 JavaScript 中用于精确查看对象某个属性“内部特征”的核心方法。它不返回属性值,而是返回该属性的完整描述符(descriptor),帮你看清这个属性是否可写、可枚举、是否可配置,甚至是否是访问器属性(getter/setter)。
获取属性的完整描述符
调用方式很简单:传入目标对象和属性名,返回一个描述符对象(descriptor)。如果属性不存在或为继承属性(不在对象自身上),则返回 undefined。
- 只检测对象自身的属性,不查找原型链上的属性
- 对不可枚举属性(如
toString)也有效,只要它在对象自身上定义 - 若属性是通过
Object.defineProperty显式设置的,返回值能完全反映当初的配置
理解返回的 descriptor 结构
返回对象通常包含以下字段(取决于属性类型):
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
value 和 writable:适用于数据属性(普通属性),
value是当前值,writable表示能否被重新赋值 -
get 和 set:适用于访问器属性(getter/setter),两者可能为
undefined,但至少有一个存在 -
enumerable:决定该属性是否会出现在
for...in循环或Object.keys()中 - configurable:决定该属性能否被删除、能否修改其 descriptor(如从 writable 改为 false)、能否转成访问器属性等
区分数据属性与访问器属性
通过 descriptor 能一眼判断属性类型:
- 如果返回对象中有
value或writable,基本是数据属性 - 如果返回对象中有
get或set,就是访问器属性(哪怕其中一个为undefined) - 二者字段互斥:数据属性不会同时含
get/set;访问器属性不会有value/writable
实际调试中的典型用途
这个方法常用于排查“为什么改不了这个属性?”、“为什么 for...in 看不到它?”等问题:
- 检查某属性是否被设为
writable: false,解释为何赋值无效(严格模式下会报错,非严格模式静默失败) - 确认
enumerable: false的属性为何不出现在JSON.stringify或遍历中 - 验证第三方库是否用 getter 封装了某些行为(比如 Vue 的响应式属性、React 的代理属性)
- 配合
Object.defineProperty做逆向分析:先 get,再 set 同样的 descriptor,实现“安全复制”属性特性

















