严格模式下给只读属性赋值会直接报错;需显式启用"use strict",并通过object.defineproperty设置writable: false和configurable: false,或使用object.freeze、getter模拟实现只读。

在严格模式下,给只读属性赋值会直接报错——这不是“需要额外防止”,而是语言机制自动生效的行为。关键在于如何定义只读属性,以及确保代码运行在严格模式下。
严格模式是前提
必须显式启用:
"use strict";
放在脚本顶部或函数体开头(ES6 模块默认启用)。没有它,对只读属性赋值只是静默失败(非严格模式下),不会抛出错误。
定义真正只读的属性
只读性由属性描述符控制,核心是 writable: false,且通常配合 configurable: false 防止被重新配置:
const obj = {};
Object.defineProperty(obj, "PI", {
value: 3.14159,
writable: false, // 不可修改值
configurable: false // 不可删除、不可重定义
});
此时在严格模式下执行:
obj.PI = 3; // TypeError: Cannot assign to read only property 'PI'
常见易错点
- 用字面量直接赋值(如
obj.x = 1)无法创建只读属性,它总是writable: true - 仅设
writable: false但没锁configurable,仍可通过Object.defineProperty重新打开writable - 类字段(
class X { x = 1 })默认可写,需用 getter 模拟只读,或在构造中用defineProperty
更稳妥的只读方案
- 对整个对象冻结:
Object.freeze(obj)→ 所有自有属性变为writable: false+configurable: false - 用 getter 不暴露 setter:
Object.defineProperty(obj, "version", { get() { return "2.0"; }, set() { throw new Error("version is read-only"); } });
本质上,严格模式不“防止”赋值,而是让违反只读约定的行为立刻暴露为错误,便于早期发现逻辑问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











