当configurable为false时,属性不可删除且不可重定义,但数据属性在writable为true时仍可修改value;重定义判定包括修改configurable/enumerable/writable、切换属性类型或delete操作,均会抛出typeerror。

当 JavaScript 中属性的 configurable 为 false 时,该属性**不能被删除,也不能被重新定义(即不能用 Object.defineProperty() 修改其描述符中的 configurable、writable、enumerable,也不能将其从数据属性改为访问器属性,或反之)**。但有一个关键例外:若原为数据属性且 writable: true,仍可修改其 value(包括设为 undefined 或 null),这不算“重定义”。
哪些操作会触发“重定义判定”并抛出 TypeError?
以下操作在 configurable: false 时会直接报错(严格模式下;非严格模式下部分静默失败,但行为一致):
- 再次调用
Object.defineProperty(obj, 'prop', {...})并试图修改configurable、enumerable或writable字段 - 将数据属性改为访问器属性(如添加
get或set) - 将访问器属性改为数据属性(如添加
value或writable) - 调用
delete obj.prop
哪些操作仍被允许?
即使 configurable: false,只要满足前提条件,以下操作合法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 修改数据属性的
value(前提是writable: true) - 将
writable: true改为false(单向降级,不可逆) - 读取属性(
obj.prop)、遍历(for...in,若enumerable: true)等常规访问
常见陷阱示例
容易误以为“能改 value 就能改其他”,但实际限制严格:
const obj = {};
Object.defineProperty(obj, 'x', {
value: 1,
writable: true,
enumerable: true,
configurable: false
});
obj.x = 2; // ✅ 允许(改值)
Object.defineProperty(obj, 'x', { writable: false }); // ✅ 允许(writable 降级)
Object.defineProperty(obj, 'x', { enumerable: false }); // ❌ TypeError
Object.defineProperty(obj, 'x', { get() { return 42; } }); // ❌ TypeError(数据→访问器)
delete obj.x; // ❌ TypeError
如何判断一个属性是否可重定义?
没有直接 API 返回“是否可重定义”,但可通过尝试捕获异常间接检测(不推荐用于生产逻辑):
- 调用
Object.getOwnPropertyDescriptor(obj, 'prop')查看configurable值 - 注意:即使
configurable: true,若writable: false,也不能改value,但可改其他字段 - 冻结对象(
Object.freeze())会隐式将所有自有属性设为configurable: false, writable: false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










