Object.assign() 是 JavaScript 模块中合并多个导出对象为统一接口的简洁、兼容性好且语义清晰的方式,适用于聚合模块入口、避免重复导出、支持重命名/过滤/增强及解决循环导出问题。

在 JavaScript 模块中,导出多个对象并合并成一个统一接口时,Object.assign() 是一种简洁、兼容性好且语义清晰的方式。它不依赖 ES6+ 的解构或动态导入,适合需要向后兼容或构建聚合模块(如工具库主入口)的场景。
为什么用 Object.assign 合并导出对象
当项目按功能拆分多个模块(如 utils/string.js、utils/number.js),又希望用户通过单一入口(如 utils/index.js)访问全部能力时,手动重复写 export { xxx } from './xxx' 易遗漏、难维护。而集中导出对象再合并,更灵活可控:
- 可添加运行时逻辑(如环境判断、懒加载包装)
- 支持重命名、过滤或增强属性(如加前缀、注入上下文)
- 避免循环导出问题(尤其在 CJS/ESM 混合环境中)
基础用法:合并多个模块的默认导出
假设你有以下模块:
// string.js
export default {
trim: (s) => s.trim(),
upper: (s) => s.toUpperCase()
};
<p>// number.js
export default {
add: (a, b) => a + b,
isEven: (n) => n % 2 === 0
};在入口文件中合并导出:
立即学习“Java免费学习笔记(深入)”;
// index.js
import string from './string.js';
import number from './number.js';
<p>// 合并为一个对象并默认导出
export default Object.assign({}, string, number);</p><p>// 或具名导出(如果需同时支持两种方式)
export const utils = Object.assign({}, string, number);使用方即可:import utils from './utils'; 或 import { utils } from './utils';
进阶技巧:处理命名冲突与属性增强
若不同模块导出同名方法(如都含 format),可主动控制覆盖顺序或做隔离:
import string from './string.js';
import date from './date.js';
<p>// 让 date.format 优先覆盖 string.format
export default Object.assign({}, string, date);</p><p>// 或加命名空间避免冲突
export default {
string: { ...string },
date: { ...date }
};也可在合并前加工属性:
const enhancedString = {
...string,
safeTrim: (s) => (s ?? '').trim() // 增强容错
};
<p>export default Object.assign({}, enhancedString, number);注意点与替代方案对比
Object.assign() 浅拷贝,不处理嵌套对象的合并(如需深合并,改用 lodash.merge 或自定义逻辑)。另外注意:
- ESM 中无法直接
export default Object.assign(...)(语法错误),必须先赋值给变量再导出 - Tree-shaking 可能受限:打包器难以静态分析动态合并的对象,建议对高频使用的独立功能仍保留具名导出
- 现代替代:ES2022 起可配合
export * as ns from './mod'实现命名空间导出,但兼容性略低
实际项目中,常将 Object.assign 用于构建“聚合包入口”,内部模块仍保持清晰的具名导出,兼顾可维护性与易用性。










