You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ES6/React中导出类实例的安全性:单例与垃圾回收问题问询

关于ES6模块导出类实例的疑问解答

嘿,你的这两个问题本质上都是围绕ES模块的核心特性展开的,我来给你掰扯清楚:

问题1:导出类实例后,所有导入是否指向同一个实例,不会重新实例化?

完全没问题! ES模块天生遵循单例模式:当一个模块第一次被导入时,它的代码会被完整执行一次,所有导出的变量都是模块内部值的引用。也就是说:

  • 你导出的类实例只会在模块首次被加载时创建一次
  • 任何后续的导入操作,拿到的都是同一个实例的引用,绝不会重新执行模块代码、也不会重新实例化

问题2:你给出的Jwt类导出方式是否安全?

先把你的代码再贴出来方便对照:

class Jwt { 
  token: string; 
  constructor() { this.token = ''; } 
  set(token: string) { this.token = token; } 
  get() { return this.token; } 
}
export const jwt = new Jwt();

这种导出方式非常安全,而且你完全可以依赖以下两点:

  • 所有通过 import { jwt } from 'helpers/jwt'; 导入的地方,拿到的都是同一个Jwt实例。不管你在多少个文件里导入,在A文件调用jwt.set()设置的token,在B文件调用jwt.get()就能拿到最新值——因为所有操作的都是同一个对象。
  • 这个实例不会被垃圾回收,也不会被重新初始化。ES模块在应用运行期间会被持续保留在内存中,模块导出的jwt变量会被所有导入它的模块持有引用,垃圾回收器不会回收还有活跃引用的对象。只要你的应用在运行,这个实例就会一直存在,不会被销毁后重新创建。

举个简单的验证例子:
在A文件中:

import { jwt } from 'helpers/jwt';
jwt.set('my-token-123');

在B文件中:

import { jwt } from 'helpers/jwt';
console.log(jwt.get()); // 会输出'my-token-123',足以证明是同一个实例

内容的提问来源于stack exchange,提问作者PresentProgrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:17:33