JavaScript 中 class 语法定义类表达式的完整指南
在 JavaScript 中,定义类表达式是指将 class 当作值来使用,而不是像传统的类声明那样以 class ClassName { ... } 开头。这种方式与函数表达式类似,可以赋值给变量、作为参数传递、立即执行,同时支持具名和匿名两种形式。掌握类表达式能让你更灵活地组织代码,尤其在函数式编程和动态场景中非常实用。

基本写法:匿名类表达式
最常见的做法是将匿名类赋值给一个变量,不指定类名:
- let Animal = class { constructor(name) { this.name = name; } };
- 此时
Animal.name返回字符串"Animal"(引擎会自动推断类名称) - 必须预先声明才能使用,不存在提升(hoisting),否则会抛出 ReferenceError 错误
具名类表达式:内部可自引用
可以在 class 关键字后添加一个名称,该名称仅在类内部可见,适用于调试或递归调用场景:
- const Calculator = class Calc { factorial(n) { return n
Calc在类外部无法访问,但类内部方法可以借助它进行递归自调用Calculator.name属性的值是"Calc",而非"Calculator"
作为参数或立即执行的类
类表达式能够参与更多函数式操作,提升代码复用性:
- 传递给高阶函数:function createClass(ClassDef) { return new ClassDef('test'); } const inst = createClass(class { constructor(x) { this.val = x; } });
- 立即实例化:(class { init() { console.log('ready'); } }).prototype.init();(注意不能直接使用
new class{...}(),需要用括号包裹) - 配合模块导出:export default class { ... };
类表达式与类声明的关键区别
- 类声明受语法限制只能在块级作用域的顶层出现,而类表达式可以在任意位置(如 if 语句内、函数中)灵活使用
- 类声明会绑定到标识符且禁止重复声明;类表达式仅仅是赋值操作,同一变量可以被多次赋予不同的类定义
- 调试时,具名类表达式的堆栈跟踪会显示内部名称(如
Calc),匿名类则显示变量名或"class",有助于快速定位问题
