应避免在构造函数中执行耗时IO操作,构造函数只负责轻量初始化;IO操作应移至独立方法、异步工厂函数、构建器模式或延迟加载中实现,并通过预热共享数据降低重复IO。

避免在构造函数中执行耗时 IO 操作,是提升对象创建速率的关键。构造函数应当轻量、确定、无副作用——它只负责初始化内存状态,不承担资源获取或外部交互职责。
把 IO 操作移出构造函数
将文件读取、网络请求、数据库查询等操作从构造函数中剥离,改由独立方法(如 load()、initAsync() 或工厂函数)按需触发。
- 构造函数只设置默认字段、校验必填参数、分配内部结构体
- IO 相关逻辑封装为显式调用的方法,调用者清楚知道“这步会等待”
- 例如:用
new ConfigLoader()立即返回,再调用loader.loadFromFile("config.json")
使用工厂函数或构建器模式预加载
若对象必须持有 IO 结果才能使用,优先通过异步工厂函数创建完整实例,而非让构造函数阻塞。
- 定义
async function createService() { const data = await fetch(...); return new Service(data); } - 构建器(Builder)可分步设置参数,最后调用
.build()执行 IO 并返回实例 - 避免“半初始化”对象暴露给外部——工厂确保返回的总是可用状态
延迟加载(Lazy Initialization)按需触发
对非必需的 IO 资源,采用首次访问时才加载的策略,构造时不初始化,访问属性/方法时才执行。
- 用私有字段 + getter 组合,内部加
if (!this._cache) this._cache = await read(); - 注意线程/协程安全:多并发首次访问需加锁或用
Promise缓存避免重复加载 - 适合配置项、静态资源、可缓存的元数据等场景
预热或启动期集中加载
若多个对象依赖同一类 IO 数据(如全局配置、证书、词典),不要每个实例都重复读,改为应用启动时统一加载并共享。
- 启动时读取一次,存入单例、模块级变量或依赖注入容器
- 构造函数仅接收已就绪的数据引用,如
new Processor(sharedConfig) - 降低 IO 总次数,消除构造时延不确定性

















