ES Modules 导出类和构造函数需顶层 export:类支持命名导出(多个)或默认导出(一个),构造函数同理;导入须匹配导出类型,注意不可嵌套、单默认限制及类表达式需 default 包裹。

JavaScript 中 ES Modules 导出类和构造函数,核心就两点:用 export 显式暴露,且语法位置必须在模块顶层(不能套在函数或条件块里)。
导出类(命名导出 or 默认导出)
类可以按需选择命名导出或默认导出:
- 命名导出适合一个模块提供多个类,导入时需用花括号并保持名称一致
- 默认导出适合该模块主要只暴露一个类,导入时可自由起名,更简洁
示例:
// shapes.js
// ✅ 命名导出(可导出多个)
export class Circle {
constructor(radius) { this.radius = radius; }
area() { return Math.PI * this.radius ** 2; }
}
export class Rectangle {
constructor(width, height) { this.width = width; this.height = height; }
area() { return this.width * this.height; }
}
// ✅ 默认导出(仅一个)
export default class Square {
constructor(side) { this.side = side; }
area() { return this.side ** 2; }
}
导出构造函数(本质是函数,用 export default 或 export 均可)
ES6 之后推荐用 class,但若仍需导出传统构造函数(如兼容旧逻辑或工厂模式),它和普通函数一样处理:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 用 export default 导出匿名或具名函数,导入时任意命名
- 用 export function 命名导出,导入时需用原名或重命名
示例:
// user.js
// ✅ 默认导出构造函数(推荐用于单一主构造器)
export default function User(name, age) {
this.name = name;
this.age = age;
}
// ✅ 命名导出(适合辅助构造器或工厂)
export function createUser(name) {
return new User(name, 0);
}
export const createAdmin = (name) => new User(name, 0);
export { createAdmin as adminFactory };
导入时的对应写法
导入方式取决于导出类型,不混淆就不会错:
- 命名导出的类 →
import { Circle, Rectangle } from './shapes.js' - 默认导出的类 →
import Square from './shapes.js'(无花括号) - 混合导入 →
import Square, { Circle } from './shapes.js' - 构造函数同理:默认导出用
import User from './user.js';命名导出用import { createUser, adminFactory } from './user.js'
注意事项
几个容易踩的坑要避开:
- 类和函数都不能在 if、for 或函数体内用 export —— 必须顶层声明或顶层 export
- 一个模块最多一个
export default,但可同时有多个命名导出 - 类本身不是值,但类声明会绑定一个构造函数值,所以
export default class {...}是完全合法的 - 如果导出的是类表达式(非声明),必须用
export default包裹,不能直接export default class A {}以外的形式单独命名导出类表达式

















