object.getownpropertydescriptor()通过返回对象是否含value/writable或get/set字段来区分数据属性与访问器属性:含value和writable为数据属性,含get或set为访问器属性,二者互斥。

在 JavaScript 中,Object.getOwnPropertyDescriptor() 返回的对象能明确告诉你一个属性是数据属性(data property)还是访问器属性(accessor property)。关键看返回对象中是否含有 value / writable,还是含有 get / set。
数据属性的特征表现
数据属性用于直接存储值。调用 Object.getOwnPropertyDescriptor(obj, key) 后,若返回对象包含以下字段,就属于数据属性:
-
有
value字段:表示当前属性值(可能是undefined) -
有
writable字段:布尔值,表示能否修改该值 -
有
enumerable和configurable:控制遍历与删除/重定义行为(两者对两类属性都存在)
例如:const obj = { a: 42 };<br>console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
输出:{ value: 42, writable: true, enumerable: true, configurable: true }
访问器属性的特征表现
访问器属性不保存实际值,而是通过 get 和/或 set 函数控制读写。其描述符中不会出现 value 和 writable,取而代之的是:
-
有
get字段:函数,读取属性时执行(可能为undefined) -
有
set字段:函数,设置属性时执行(可能为undefined) - 同样有
enumerable和configurable
例如:const obj = {};<br>Object.defineProperty(obj, 'b', {<br> get() { return 100; },<br> set(v) { console.log('set:', v); }<br>});<br>console.log(Object.getOwnPropertyDescriptor(obj, 'b'));
输出:{ get: [Function: get], set: [Function: set], enumerable: false, configurable: false }
如何快速判断类型(实用技巧)
不需要死记字段,可用逻辑判断:
- 如果返回描述符中
'value' in desc为true→ 数据属性 - 如果
'get' in desc || 'set' in desc为true→ 访问器属性 - 两者不会同时出现 —— JavaScript 引擎会拒绝混合定义(如同时传
value和get)
注意:默认属性都是数据属性
用字面量或赋值创建的属性(如 obj.x = 1、const obj = { y: 2 })默认都是数据属性,且 writable、enumerable、configurable 均为 true。只有显式用 Object.defineProperty() 或 Object.defineProperties() 指定 get/set,才会生成访问器属性。










