javascript可通过类表达式动态创建匿名类,支持闭包注入配置、继承扩展及new.target区分调用,具备完整class特性但无全局标识符。

JavaScript 中可以通过 类表达式(class expression) 动态创建匿名类,它不绑定标识符,可立即赋值给变量、作为函数返回值、或传入其他函数,非常适合运行时按需构造类。
基本语法:用 class 表达式定义匿名类
类表达式和函数表达式类似,class 关键字后不跟类名,直接跟花括号:
const MyDynamicClass = class {
constructor(value) {
this.value = value;
}
getValue() {
return this.value;
}
};
此时 MyDynamicClass 指向一个匿名类,MyDynamicClass.name 会是 "Anonymous"(或空字符串,取决于引擎),但不影响使用。
运行时动态生成类(带参数化行为)
利用闭包,可在创建类时“注入”配置,实现行为定制:
- 把类定义包裹在函数中,接收参数(如方法逻辑、默认属性等)
- 在类内部引用外部作用域的变量或函数
- 返回该匿名类,供后续实例化
示例:生成带预设前缀的日志类
function createLogger(prefix) {
return class {
log(msg) {
console.log(`[${prefix}] ${msg}`);
}
};
}
const InfoLogger = createLogger('INFO');
const ErrorLogger = createLogger('ERROR');
new InfoLogger().log('User logged in'); // [INFO] User logged in
new ErrorLogger().log('Network failed'); // [ERROR] Network failed
配合 new.target 或 extends 实现更灵活继承
匿名类同样支持 extends 和访问 new.target:
- 可继承内置类(如
Array、Error)或自定义基类 - 在构造器中用
new.target区分直接调用与子类调用 - 适合封装特定语义的子类工厂
示例:动态扩展 Error 类并添加状态码
function createApiError(statusCode) {
return class extends Error {
constructor(message) {
super(message);
this.statusCode = statusCode;
this.name = `ApiError${statusCode}`;
}
};
}
const NotFoundError = createApiError(404);
const err = new NotFoundError('Resource not found');
console.log(err.statusCode); // 404
console.log(err instanceof Error); // true
注意事项与兼容性
类表达式是 ES2015+ 特性,所有现代浏览器及 Node.js(≥ v6)均支持。需注意:
- 类表达式不会被提升(unlike function declarations),必须先声明再使用
- 不能重复声明同名变量(
const C = class {}; const C = class {};报错) - 调试时 DevTools 可能显示为
class Anonymous,可通过命名类表达式(class Logger {...})改善可读性(但仍是表达式)
不复杂但容易忽略:匿名类本质仍是标准 Class,拥有完整原型链、静态方法、getter/setter 等能力,只是没有全局绑定名。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











