在 JavaScript 中,Object.defineProperty() 和 Object.defineProperties() 可动态修改属性描述符,但前提是 configurable 为 true;若 configurable: false,则仅允许将 writable 从 true 改为 false,其他修改会静默失败或抛出 TypeError。
在 JavaScript 中,可以通过 Object.defineProperty() 或 Object.defineProperties() 动态修改已存在属性的描述符,但前提是该属性的 configurable 描述符为 true。如果 configurable: false,则大部分描述符(如 writable、enumerable、configurable 本身)将无法被修改,仅允许在 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(从 true → false),其他修改会静默失败(非严格模式)或抛出 TypeError(严格模式)。
即使属性已存在,只要满足可配置条件,即可覆盖部分描述符:
立即学习“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 改变 value 或 set/get(除非先设 writable: true,再改 value)writable: false 改回 true 会失败(无论 configurable 是否为 true)get/set 访问器时,必须同时省略 value 和 writable,否则报错Object.getPrototypeOf(obj)),再对其操作