JavaScript中类表达式可匿名或命名,支持赋值、传参、立即执行,功能与类声明完全一致,适用于动态创建类、策略模式、默认导出及测试场景。

JavaScript 中可以通过类表达式(Class Expressions)以表达式形式定义类,就像函数表达式一样,它可以是命名的,也可以是匿名的,并且可以赋值给变量、作为参数传递或立即执行。
基本语法:匿名类表达式
最常见的是将一个匿名类赋值给变量:
const MyClass = class {
constructor(name) {
this.name = name;
}
greet() {
return `Hello, ${this.name}`;
}
};
const instance = new MyClass("Alice");
console.log(instance.greet()); // "Hello, Alice"
命名类表达式(Named Class Expression)
类表达式可以有名字,该名字只在类内部可见(比如用于递归调用或调试显示),外部不可访问:
const Animal = class Creature {
constructor(name) {
this.name = name;
}
toString() {
return `Creature: ${this.name}`; // 可在内部使用 Creature
}
// 例如递归场景(虽不常用):
static createTwins(name) {
return [new Creature(name + "-1"), new Creature(name + "-2")];
}
};
注意:Creature 在外部作用域中无法引用,typeof Creature 是 undefined;但 Animal.name 返回 "Creature",有助于调试和栈追踪。
类表达式支持的所有特性
类表达式与类声明(class MyClass {...})功能完全一致,支持:
- 构造函数(
constructor) - 实例方法和 getter/setter
- 静态方法(用
static关键字) - 私有字段和方法(
#field,#method()) - 继承(通过
extends,包括继承表达式结果)
const Parent = class {
constructor(value) { this.value = value; }
};
const Child = class extends Parent {
constructor(value, extra) {
super(value);
this.extra = extra;
}
};
典型使用场景
类表达式适合以下情况:
- 动态创建类:根据条件返回不同类,如插件系统或策略模式
-
立即执行类(IIFE-like):配合
new和括号实现一次性构造(需注意语法避免解析错误) -
导出默认类时保持匿名性:ESM 中
export default class {...}实际就是默认类表达式 - 测试或沙箱环境:临时定义带特定行为的类,避免污染全局命名空间











