一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何动态修改 JavaScript 中已存在属性的描述符

时间:2026-07-07 11:26:51 编辑:袖梨 来源:一聚教程网

在 JavaScript 中,Object.defineProperty() 和 Object.defineProperties() 可动态修改属性描述符,但前提是 configurable 为 true;若 configurable: false,则仅允许将 writable 从 true 改为 false,其他修改会静默失败或抛出 TypeError。

在 JavaScript 中,可以通过 Object.defineProperty()Object.defineProperties() 动态修改已存在属性的描述符,但前提是该属性的 configurable 描述符为 true。如果 configurable: false,则大部分描述符(如 writableenumerableconfigurable 本身)将无法被修改,仅允许在 writable: true 时把 writable 改为 false

确认目标属性是否可配置

修改前应先检查属性的当前描述符,尤其是 configurable 值:

const obj = { a: 1 };console.log(Object.getOwnPropertyDescriptor(obj, 'a'));// { value: 1, writable: true, enumerable: true, configurable: true }

若返回的描述符中 configurable: false,说明该属性已被锁定,后续只能降级 writable(从 truefalse),其他修改会静默失败(非严格模式)或抛出 TypeError(严格模式)。

使用 Object.defineProperty 修改单个描述符

即使属性已存在,只要满足可配置条件,即可覆盖部分描述符:

立即学习“Java免费学习笔记(深入)”;

  • 想让属性不可写:设置 writable: false
  • 想让它不参与 for...in 遍历:设置 enumerable: false
  • 想彻底锁定该属性(禁止后续任何描述符修改或删除):设置 configurable: false(注意:此操作不可逆)

示例:

const obj = { x: 42 };Object.defineProperty(obj, 'x', {  writable: false,  enumerable: false});// 此时 x 仍可读,但不能改值、不会被遍历,且不能再被 defineProperty 修改(因 configurable 默认为 false)

批量修改多个属性描述符

Object.defineProperties() 可一次性更新多个已有属性的描述符:

const obj = { a: 1, b: 2, c: 3 };Object.defineProperties(obj, {  a: { writable: false },  b: { enumerable: false },  c: { configurable: false }});

注意:每个子描述符对象只需提供要修改的字段,未指定的字段保持原值(但前提是 configurable: true)。

常见限制与注意事项

  • configurable: false 后,不能再通过 defineProperty 改变 valueset/get(除非先设 writable: true,再改 value
  • 尝试把 writable: false 改回 true 会失败(无论 configurable 是否为 true
  • 添加或修改 get/set 访问器时,必须同时省略 valuewritable,否则报错
  • 对普通对象属性有效;对原型链上的属性需先获取其所在对象(如 Object.getPrototypeOf(obj)),再对其操作

热门栏目