javascript模块化中构造函数导出需按模块系统区分:es6模块支持命名/默认导出class或函数,commonjs须用module.exports赋值;应避免副作用,兼顾兼容性时可同时暴露default和具名属性。

在 JavaScript 模块化中,构造函数本身不是特殊类型,它只是普通函数(或类),导出方式取决于你使用的模块系统:ES6 模块(ESM)或 CommonJS(CJS)。关键不是“怎么导出构造函数”,而是“如何规范、安全、可维护地暴露一个能被 new 调用的构造器”。下面分场景说明核心做法和常见陷阱。
ES6 模块中导出构造函数(推荐用于现代环境)
ES6 支持命名导出和默认导出。构造函数可作为具名值导出,也可设为默认导出。
- 导出为命名函数(适合一个文件含多个构造器):
person.jsexport function Person(name, age) {<br> this.name = name;<br> this.age = age;<br>}<br>export function Employee(name, age, title) {<br> Person.call(this, name, age);<br> this.title = title;<br>} - 导出为 class(语义更清晰,等价于构造函数):
export class Animal {<br> constructor(species) {<br> this.species = species;<br> }<br>} - 设为默认导出(适合该模块主职责就是这个构造器):
export default class DatabaseConnection {<br> constructor(url) {<br> this.url = url;<br> }<br>}
使用时:import DB from './db.js'; const db = new DB('http://...');
CommonJS 中导出构造函数(Node.js 传统环境)
Node.js 默认使用 CommonJS,必须通过 module.exports 显式暴露,exports 仅作快捷引用,不可直接赋值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正确方式:将构造函数赋给
module.exports(最常用):
user.jsfunction User(email, password) {<br> this.email = email;<br> this.password = password;<br>}<br>User.prototype.login = function() { /* ... */ };<br>module.exports = User; - 也支持导出对象,把构造函数挂载为属性:
module.exports = {<br> User: function(email, password) { /* ... */ },<br> Admin: function(email, role) { /* ... */ }<br>};
使用时:const { User } = require('./user'); - ⚠️ 错误写法(断开引用,导致导出为空):
exports = function User() {}; // 不生效!require 得到的是 {}
兼顾兼容性与设计意图的导出策略
当希望模块既支持 ESM 又便于 CJS 消费(例如发布到 npm),可采用以下实践:
- 主构造函数设为
module.exports,同时挂载静态方法或版本信息:function ApiClient(baseURL) { this.baseURL = baseURL; }<br>ApiClient.create = () => new ApiClient('https://api.example.com');<br>module.exports = ApiClient;<br>module.exports.version = '2.1.0'; - 若需模拟 ESM 的命名导出效果(如供 ESM 用户解构),可在 CJS 文件中额外暴露:
module.exports.User = User;<br>module.exports.Product = Product;<br>module.exports.default = User; // 兼容 import User from '...'
- 避免在构造函数内部做副作用操作(如自动连接数据库),确保
new X()是纯初始化行为,提升可测试性。
导入与使用注意事项
无论哪种导出方式,调用构造函数前要确认导入结果类型:
- ESM 命名导入:
import { Person } from './person.js'; const p = new Person('Alice', 30); - ESM 默认导入:
import Vehicle from './vehicle.js'; const v = new Vehicle('Tesla'); - CJS 导入:
const Car = require('./car.js'); const c = new Car('BMW'); - 注意:ESM 中
import * as ns from '...'会把默认导出放在ns.default,命名导出在ns.Xxx—— 别漏掉.default。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










