设 configurable: false 可禁止删除属性、修改描述符及属性类型转换;需用 object.defineproperty 显式设置,且不可逆;它仅限制定义变更,值是否可改取决于 writable,枚举性由 enumerable 控制。

把 configurable: false 设上,属性就删不掉、改不了描述符了——这是最直接有效的办法。
configurable: false 能阻止哪些操作
设为 false 后,以下行为全部被禁止:
- 执行
delete obj.prop:非严格模式返回false,严格模式直接抛TypeError - 用
Object.defineProperty修改enumerable、configurable自身,或把writable: false改回true - 把数据属性(含
value)和访问器属性(含get/set)互相转换
怎么设置才真正生效
必须用 Object.defineProperty 显式定义,并明确写上 configurable: false:
- 对象字面量直接赋值(如
obj.x = 1)创建的属性,默认configurable: true,删得掉 -
Object.defineProperty若没写configurable,默认是false,但别依赖默认值,显式声明更清晰 - 一旦设成
false,就不可逆——不能再通过任何方式把它改回true
和其他描述符怎么配合用
单独设 configurable: false 不等于“完全锁死”,它只管“能不能动定义”,不管“能不能动值”:
- 如果
writable: true,属性值仍可修改(obj.prop = 'new') - 如果
writable: false,值不能改,加上configurable: false,就接近常量效果 - 如果
enumerable: false,该属性不会出现在for...in或Object.keys()中,但访问依然有效
和 Object.seal / Object.freeze 的区别
它们都用了 configurable: false,但作用范围不同:
-
Object.seal(obj):对所有自有属性设configurable: false,保留原有writable值 -
Object.freeze(obj):在 seal 基础上,再把所有writable设为false - 而手动设
configurable: false更灵活——只锁特定属性,不影响其他属性,也不影响对象是否可扩展











