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
相关产品推荐
相关产品推荐

