export default 本质是向模块导出对象直接赋值 default 属性,不涉及原型链封装或代理,仅是语法约定的属性挂载与读取。

模块系统对 default 导出并没有在底层原型链上做特殊封装处理。
default 导出本质是普通属性赋值
当使用 export default value 时,模块系统实际是在模块的“导出对象”(module.exports 的等价物)上添加一个名为 default 的自有属性,其值就是你导出的内容。这不是原型链上的继承或代理,而是直接赋值:
- 模块 A 写
export default class Foo {}→ 等效于在模块对象上执行exports.default = Foo - 导入时
import Foo from './A'→ 实际是从该模块对象的.default属性取值,再绑定到本地变量 - 这个
default属性和exports.named一样,都是模块对象自身的可枚举属性,不涉及__proto__或原型查找
与 class 语法糖无关,也不修改原型链
ES6 class 本身是原型链机制的语法糖,但 export default class 并不会额外包裹、代理或重写其原型链:
-
export default class C {}导出的是构造函数本身,它的C.prototype和普通 class 完全一致 - 导入后得到的仍是原构造函数,
instanceof、Object.getPrototypeOf等行为全部保持原样 - 模块系统只负责“传递引用”,不介入对象内部结构或原型关系
为什么有人误以为有“封装”?
常见混淆点来自两个层面:
-
导入语法差异:不用大括号(
import X from)让人感觉像“解构默认值”,实则只是解析器对.default属性的快捷访问约定 - 模块作用域隔离:模块内声明的 class/函数本身就在独立词法环境中定义,这属于模块作用域机制,不是对原型链的干预
-
打包工具干扰:某些旧版 Webpack 或 Babel 的 CommonJS 转译会用
module.exports.default = …+__esModule标记,但这属于兼容层,非 ES 模块规范本身
简言之:export default 是模块系统的导出约定,不是对象模型改造;它不碰原型链,也不封装实例行为——它只是把你要的东西,干净利落地挂到模块对象的 default 键上。










