可通过Object.getOwnPropertyDescriptor()获取属性描述符并检查configurable字段判断属性是否可配置:返回undefined表示属性不存在,configurable为false表示不可配置,且该方法仅检测自有属性。

可以通过 Object.getOwnPropertyDescriptor() 获取属性描述符,检查其中的 configurable 字段是否为 true。
使用 getOwnPropertyDescriptor 检查单个属性
该方法返回指定对象自有属性的属性描述符对象,其中包含 configurable 布尔值,表示该属性是否可被删除、是否可修改其描述符(如 writable、enumerable、configurable 本身)。
- 如果返回值为
undefined,说明该属性不存在(非继承属性) - 如果返回值存在但
configurable: false,则该属性不可配置 - 注意:仅检测自有属性,不检测原型链上的属性
示例:
const obj = { a: 1 };
Object.defineProperty(obj, ‘b’, { value: 2, configurable: false });
console.log(Object.getOwnPropertyDescriptor(obj, ‘a’)?.configurable); // true
console.log(Object.getOwnPropertyDescriptor(obj, ‘b’)?.configurable); // false
console.log(Object.getOwnPropertyDescriptor(obj, ‘c’)?.configurable); // undefined
批量检测多个属性是否可配置
结合 Object.keys() 或 Object.getOwnPropertyNames() 遍历属性名,逐一调用 getOwnPropertyDescriptor。
立即学习“Java免费学习笔记(深入)”;
- 用
Object.keys()只检查可枚举的自有属性 - 用
Object.getOwnPropertyNames()检查所有自有属性(包括不可枚举的) - 对每个属性判断
descriptor?.configurable === true
示例:
const obj = { x: 1 };
Object.defineProperty(obj, ‘y’, { value: 2, enumerable: false, configurable: false });
const configStatus = {};
Object.getOwnPropertyNames(obj).forEach(key => {
const desc = Object.getOwnPropertyDescriptor(obj, key);
configStatus[key] = desc?.configurable ?? false;
});
console.log(configStatus); // { x: true, y: false }
注意不可配置属性的限制行为
当 configurable: false 时,以下操作会失败或被忽略:
- 无法通过
delete删除该属性(静默失败,严格模式下报错) - 无法再次调用
Object.defineProperty()修改configurable、enumerable(除非目标值与当前一致) - 若原属性是访问器(
get/set),不能改为数据属性;反之亦然 -
writable可从true改为false,但不能再改回true
与 in 操作符和 hasOwnProperty 的区别
这些方法只能判断属性是否存在或是否为自有属性,无法反映可配置性:
-
'prop' in obj:检查自身或原型链上是否存在该属性 -
obj.hasOwnProperty('prop'):仅检查自有属性(无论是否可枚举) - 二者均不提供
configurable、writable等元信息
要获取可配置性,必须依赖属性描述符机制。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/123671.html