应导出构造函数或class而非prototype对象;因prototype是构造函数内部属性,导出构造函数即自动携带其原型方法,实例可正常调用;单独导出prototype会导致this丢失、原型链断裂。

原型对象本身不能直接“导出”,因为 prototype 是构造函数的内部属性,属于运行时对象关系机制,不是模块系统的一部分。要让其他模块用到某个构造函数及其原型上的共享方法,关键在于:把构造函数(连同其 prototype 上的方法)作为一个整体导出。
导出整个构造函数(含原型方法)
这是最常用、最自然的方式。只要导出构造函数,它的 prototype 就自动被携带过去——因为原型方法已绑定在该函数上,导入后实例仍可正常使用。
- 用 ES6 模块导出构造函数(推荐):
// Person.js
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
console.log(`Hi, ${this.name}`);
};
export default Person;
- 在其他模块中导入并使用:
// main.js
import Person from './Person.js';
const p = new Person('Alice');
p.sayHi(); // Hi, Alice —— 原型方法正常调用
导出 class(语法糖,本质仍是原型)
class 是原型机制的语法糖,定义在 class 内部的普通方法会自动挂载到 prototype 上,导出 class 等价于导出带原型方法的构造函数。
- 写法简洁,语义清晰:
// Animal.js
export class Animal {
constructor(name) {
this.name = name;
}
makeSound() {
console.log(`${this.name} makes a sound`);
}
}
- 导入后创建实例,
makeSound就是原型方法,共享且可动态修改:
// app.js
import { Animal } from './Animal.js';
const dog = new Animal('Dog');
dog.makeSound(); // Dog makes a sound
不推荐:只导出 prototype 对象
不要单独导出 Person.prototype 或试图“提取”原型方法再组装,原因如下:
- 脱离构造函数后,
this失去上下文,无法正确指向实例; - 破坏原型链完整性,实例找不到方法或
constructor指向异常; - 其他模块无法通过
new创建实例,失去面向对象意义。
例如:export const sayHi = Person.prototype.sayHi; → 导入后调用 sayHi() 会报错或 this 为 undefined,无法访问 this.name。
补充:动态扩展原型也随模块生效
只要导入的是同一个构造函数或 class,后续对它的 prototype 做增删改,所有已存在和新创建的实例都会立即响应——这是原型机制的天然特性,无需额外导出。
// 在任意模块中(甚至导入后)
import Person from './Person.js';
Person.prototype.walk = function() { console.log(`${this.name} is walking`); };
// 所有 Person 实例现在都有 walk 方法


















