最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何动态修改 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,则大部分描述符(如 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(严格模式)。
使用 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改变value或set/get(除非先设writable: true,再改value) - 尝试把
writable: false改回true会失败(无论configurable是否为true) - 添加或修改
get/set访问器时,必须同时省略value和writable,否则报错 - 对普通对象属性有效;对原型链上的属性需先获取其所在对象(如
Object.getPrototypeOf(obj)),再对其操作
相关文章
- 如何登录QQ邮箱网页版 07-08
- 鄂汇办app如何重新注册二级建造师 07-08
- Soul私信功能异常如何解决 07-08
- 如何在火绒安全软件中进行右键管理菜单设置 07-08
- 智慧中小学课程教学如何删除 07-08
- 如何登录邮箱gmail 07-08