Class语法默认启用严格模式,禁止未声明变量赋值(如x=1),但允许动态添加对象属性(如this.xxx=1);限制属性新增需用Object.preventExtensions()等方法。

JavaScript 的 class 语法本身就在严格模式下定义和运行,不需要手动加 "use strict",它天然具备严格模式的所有约束,包括禁止给未声明的属性隐式赋值——但要注意:这个“禁止”针对的是变量声明,不是对象属性。关键要分清两个概念:
-
变量(identifier)未声明就赋值 → 严格模式直接报
ReferenceError - 对象上动态添加未定义的属性 → 严格模式完全允许,不报错(这是正常行为)
所以问题中“Class 语法默认禁止给未声明属性赋值”的说法存在常见误解。Class 并不阻止你给实例或原型动态加属性,它只是让内部代码执行环境自动启用严格模式,从而堵住变量污染这类漏洞。
Class 内部自动启用严格模式
所有 class 声明(包括类体、方法、getter/setter、静态方法)的代码都隐式处于严格模式:
class Person {
constructor(name) {
this.name = name;
// ✅ 合法:this 是实例,name 是已知属性名
age = 25; // ❌ 报错:ReferenceError: age is not defined
// 因为 age 没用 let/const/var 声明,也不是 this.age,属于未声明变量赋值
}
greet() {
message = "Hello"; // ❌ 报错:ReferenceError
return this.name + ", " + message;
}
}这里 age = 25 和 message = "Hello" 都是未声明的变量赋值,不是“给对象添加属性”,所以严格模式立刻拦截。
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
对象属性可以随时添加,Class 不限制
严格模式不限制对象动态设置属性,哪怕该属性之前不存在:
class Box {}
const b = new Box();
b.color = "red"; // ✅ 允许,color 是新属性
b["size"] = "large"; // ✅ 允许
b.__proto__.weight = 10; // ✅ 允许(除非该属性不可写/不可配置)
// 即使是 class 内部方法里:
class Counter {
increment() {
this.count = (this.count || 0) + 1; // ✅ 合法:给 this 添加/更新 count 属性
}
}这跟“变量未声明赋值”是两回事:this.count 中 this 是已知对象,. 或 [] 访问的是属性操作,不是变量声明。
如何真正防止意外添加属性?
如果你希望禁止给实例动态添加未定义的属性(即实现“属性白名单”),需主动控制,例如:
- 使用
Object.preventExtensions()/Object.seal()/Object.freeze() - 在
constructor中初始化所有预期属性(推荐) - 配合 TypeScript 编译时检查(非运行时)
class SafeUser {
constructor(name, email) {
// 显式初始化,避免后续拼写错误导致新属性
Object.assign(this, { name, email, role: "user" });
// 锁定对象,禁止新增属性(可选)
Object.preventExtensions(this);
}
}
const u = new SafeUser("Alice", "a@b.c");
u.phone = "123"; // ❌ 静默失败(非严格模式)或 TypeError(严格模式下 delete 不行,但赋值仍成功;preventExtensions 后赋值静默忽略)注意:Object.preventExtensions() 在严格模式下对新增属性赋值不会报错,而是静默忽略;若要报错,需配合 set 代理或自定义 setter。
总结关键点
- Class 语法自带严格模式,自动禁止未声明变量赋值(如
x = 1),不是禁止“未定义属性赋值” -
this.xxx = value是合法的属性写入,无论xxx是否预先存在 - 真正限制属性新增,得靠
Object.*方法或设计约束,不是 class 语法默认行为 - 想避免拼写错误导致的无效属性,靠初始化 + 类型工具(如 TS)+ 代码审查更实际

















