实例属性初始化器用于在class内部直接声明并初始化公有实例属性,替代constructor中冗余的this赋值,支持默认值、参数解构和与私有字段/访问器配合,es2022起原生支持,初始化表达式每次实例化时重新求值。

实例属性初始化器的作用
ES6 Class 语法本身不支持在类体顶层直接写 this.name = value 这样的赋值语句,但现代 JavaScript(ES2022 起)已正式支持公有实例字段(public instance fields),也就是常说的“实例属性初始化器”。它允许你在 constructor 外、class 内部直接声明并初始化实例属性,从而减少构造函数中的重复赋值代码。
用初始化器替代 constructor 中的 this 赋值
传统写法中,每个参数都要在 constructor 里手动绑定到 this:
❌ 冗余写法:
class User {
constructor(name, age, email) {
this.name = name;
this.age = age;
this.email = email;
}
}
使用实例属性初始化器后,可提前声明默认值或结合参数解构,让 constructor 更轻量:
✅ 简化写法:
class User {
// 直接初始化,支持默认值
name = '';
age = 0;
email = '';
<p>constructor(name, age, email) {
// 只需覆盖,无需逐个赋值
if (name !== undefined) this.name = name;
if (age !== undefined) this.age = age;
if (email !== undefined) this.email = email;
}
}</p>
更进一步,配合参数解构 + 默认值,constructor 几乎可以只做逻辑处理:
class User {
name = '';
age = 0;
email = '';
<p>constructor({ name = '', age = 0, email = '' } = {}) {
Object.assign(this, { name, age, email });
}
}</p>
与私有字段和 getter/setter 配合使用
初始化器天然兼容私有字段(# 开头)和访问器:
- 私有字段也能初始化:
#id = Math.random(); - 配合 setter 实现校验逻辑:
_age = 0; set age(value) { if (value > 0) this._age = value; } - 避免在 constructor 中重复写校验,把约束逻辑集中到 setter
注意事项和兼容性提醒
虽然写法简洁,但要注意几点:
- 该语法属于 ES2022 标准,在 Node.js ≥16.4 或 Chrome ≥91+、Firefox ≥90+、Safari ≥16.4 中原生支持;旧环境需 Babel(@babel/preset-env + @babel/plugin-proposal-class-properties)转译
- 初始化器总是在 constructor 执行前运行,所以
this已存在,但还不能调用方法或访问未初始化的私有字段 - 初始化表达式是每次实例化时重新求值的(如
count = Math.random()每次都不同),不是共享的











