JavaScript 中如何检测对象属性是否可配置

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

javascript 中如何检测对象属性是否可配置

可以通过 Object.getOwnPropertyDescriptor() 获取属性描述符,检查其中的 configurable 字段是否为 true

使用 getOwnPropertyDescriptor 检查单个属性

该方法返回指定对象自有属性的属性描述符对象,其中包含 configurable 布尔值,表示该属性是否可被删除、是否可修改其描述符(如 writableenumerableconfigurable 本身)。

  • 如果返回值为 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() 修改 configurableenumerable(除非目标值与当前一致)
  • 若原属性是访问器(get/set),不能改为数据属性;反之亦然
  • writable 可从 true 改为 false,但不能再改回 true

与 in 操作符和 hasOwnProperty 的区别

这些方法只能判断属性是否存在或是否为自有属性,无法反映可配置性:

  • 'prop' in obj:检查自身或原型链上是否存在该属性
  • obj.hasOwnProperty('prop'):仅检查自有属性(无论是否可枚举)
  • 二者均不提供 configurablewritable 等元信息

要获取可配置性,必须依赖属性描述符机制。

文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/123671.html

如何通过对比字节码分析Object.getPrototypeOf与??proto??在现代引擎中的指令集差异
上一篇 2026-07-01 12:26
如何解决Less编译过程中引用的外部CSS文件无法找到的问题?
下一篇 2026-07-01 12:39

相关推荐