用object.defineproperty定义只读属性的核心是writable: false,配合configurable: false防止删除或重定义;value与writable需搭配使用,不可与get/set混用;getter方式可实现动态只读但默认不可枚举、不可写。

用 Object.defineProperty 定义只读属性,核心是把 writable 设为 false,同时通常配合 configurable: false 防止被重新定义。
设置 writable: false 实现基础只读
只读的关键在于禁止修改属性值。只要将 writable 属性设为 false,尝试赋值就会静默失败(非严格模式)或抛出 TypeError(严格模式)。
Object.defineProperty(obj, 'name', { value: 'Alice', writable: false });- 之后执行
obj.name = 'Bob'不会改变值,严格模式下会报错
加上 configurable: false 防止删除或重定义
仅设 writable: false 时,仍可通过 defineProperty 改变 writable 或删掉该属性(如果 configurable 为 true)。加 configurable: false 才真正“锁定”:
-
delete obj.name返回false,属性不会被删除 - 再次调用
Object.defineProperty(obj, 'name', {...})会报错 - 这是实现真正只读常量的常用组合
注意 value 和 writable 的搭配规则
当使用 value 描述符时,writable、enumerable、configurable 才有效;不能和 get/set 混用。
- 错误写法:
{ value: 42, get() { return 42; } }—— 会抛出异常 - 如果想用 getter 实现只读,就不用
value,而是:{ get() { return 42; }, configurable: false } - getter 方式更灵活(比如返回动态计算值),但不可枚举、不可写是默认行为
实际应用建议
定义只读属性常见于库或配置对象中,避免意外覆盖:
- 导出常量对象时,批量冻结关键字段
- 构造函数中初始化实例属性,用
defineProperty锁定内部状态 - 注意:直接给对象字面量加
Object.defineProperty是单个属性级别操作,不是整个对象只读(要用Object.freeze)











