JavaScript类中实例变量应在constructor内用this显式赋值,确保独立副本;ES2022+支持公共字段语法(如name = 'default')和私有字段(#count);禁止原型挂载或let/var声明。

在 JavaScript 类中,实例变量应该在 构造函数(constructor) 内通过 this 显式赋值来声明,这是最标准、最清晰且兼容性最好的方式。
在 constructor 中初始化实例变量
这是推荐做法。所有属于实例的属性都应在 constructor 中初始化,确保每个实例拥有独立副本,避免原型污染或意外共享。
- 直接用
this.xxx = value赋值,如this.name = name - 即使初始值是
null、undefined或空数组/对象,也建议显式写出,提高可读性和类型推断能力 - 示例:
class Person {
constructor(name, age) {
this.name = name || ''; // 字符串实例变量
this.age = age || 0; // 数字实例变量
this.hobbies = []; // 数组(每个实例独有)
this.meta = {}; // 对象(每个实例独有)
}
}避免在类体顶层直接声明(ES2022+ 公共字段语法除外)
旧版 JS 不支持类体内直接写 name = 'default' 这样的语法(会报错)。但现代环境(ES2022 起)已支持 公共类字段(public class fields),它本质是语法糖,最终仍被转换为 constructor 内赋值。
- ✅ 支持该语法时可写:
name = 'anonymous'; hobbies = []; - ⚠️ 注意:这些字段在
constructor执行前就已初始化(顺序在 super() 之后、自身构造逻辑之前) - ❌ 不要写
let name = 'xxx'或var age = 25—— 类体中不允许用声明语句定义实例变量
不要把实例变量挂到原型上
像 Person.prototype.score = 0 或在类外直接扩展原型,会导致所有实例共享该属性,修改一个会影响其他实例(尤其对引用类型如数组、对象极其危险)。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误示例:
Person.prototype.items = [];→ 所有实例共用一个数组 - ✅ 正确做法:必须在
constructor中为每个实例新建引用类型值
私有实例变量:用 # 前缀(ES2022+)
如果需要真正私有的实例状态(不可被外部访问或继承),可用哈希前缀 # 声明私有字段。
- 必须在类体中声明(如
#id = 0;),不能动态创建 - 只能在类内部通过
this.#id访问,子类也不可访问 - 示例:
class Counter {
#count = 0;
constructor(step = 1) {
this.#step = step; // 私有实例变量
}
increment() {
this.#count += this.#step;
}
getCount() {
return this.#count;
}
}


















