es2022正式引入公共类字段语法(如name = 'alice'),在constructor前初始化并挂载到this上;es6原生支持通过this.xxx赋值定义实例属性,二者均创建实例自有属性,区别于prototype上的共享方法。

ES6 Class 语法本身最初并不支持直接在类体中声明公共实例字段(如 name = 'Alice'),这类写法是ES2022(第13版)正式引入的公共类字段(Public Class Fields)语法,属于对 class 的增强,并非原始 ES6 的一部分。但如今主流环境(Chrome、Firefox、Node.js 16+ 等)已广泛支持,实际开发中普遍使用。
公共实例字段(即公共实例属性)的定义方式
这是最直观、推荐用于初始化实例状态的方式,字段直接写在 class 大括号内,不加 function、不写 var/let/const,赋值表达式即可:
- 字段名后直接用
=赋默认值,例如name = 'Unknown'; - 该字段会自动添加到每个新创建的实例上(即挂载在
this上),且可被外部读写 - 它在构造函数执行前就被初始化(严格来说是在进入 constructor 之前),因此即使 constructor 中未显式赋值,实例也已有该属性
示例:
class Person {
// ✅ 公共实例字段(ES2022)
name = 'Anonymous';
age = 0;
isActive = true;
constructor(name, age) {
// 可选择覆盖默认值
if (name) this.name = name;
if (age >= 0) this.age = age;
}
}
const p1 = new Person('Leo', 28);
console.log(p1.name); // 'Leo'
console.log(p1.isActive); // true(未传参时仍取默认值)
在 constructor 中通过 this 定义实例属性
这是 ES6 原生就支持的方式,兼容性最好,适用于需要动态计算、依赖参数或执行逻辑的初始化场景:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 所有通过
this.xxx = value赋值的属性,都是该实例独有的公共属性 - 它们不会出现在类的 prototype 上,而是直接存在于实例对象自身
- 若未在 constructor 中赋值,该属性在实例上为
undefined(除非后续手动设置)
示例:
class Car {
constructor(brand, model, year) {
// ✅ 传统 ES6 实例属性定义方式
this.brand = brand;
this.model = model;
this.year = year;
this.id = Symbol(); // 也可是复杂值
}
}
const car = new Car('Tesla', 'Model Y', 2025);
console.log(car.brand); // 'Tesla'
console.log('id' in car); // true
注意:不要混淆“公共字段”和“原型方法”
类中定义的方法(如 greet() { ... })默认是添加到 prototype 上的,属于所有实例共享;而公共字段(含 this.xxx)始终属于单个实例,彼此隔离。二者定位不同,不可互相替代:
- 想让每个实例有自己的一份数据 → 用公共字段或
this.xxx - 想让所有实例共用一段逻辑 → 用类方法(不带
this.的函数定义) - 字段不能写在方法内部(否则只是局部变量),也不能用
let name = ...声明
常见误区提醒
以下写法是错误或无效的:
-
name: string;—— 这是 TypeScript 类型注解,JS 运行时忽略 -
var name = 'Alice';或let age = 25;—— 语法错误,class 体中不允许用声明语句 -
static name = 'Global';—— 这是静态属性,不属于实例 -
#privateField = 'hidden';—— 这是私有字段,不是公共的










