避免不必要对象创建的核心是减少内存分配和GC压力,关键在于复用、缓存、延迟初始化与结构扁平化,优先使用字面量、数组、原始值及静态方法。

避免不必要的对象创建,核心是减少运行时内存分配和垃圾回收压力。多数情况下,问题不在于“能不能创建”,而在于“是否每次都需要新对象”。关键思路是复用、缓存、延迟初始化和结构扁平化。
优先复用已有对象或基础类型
很多场景下,对象只是临时承载少量数据,完全可用字面量、数组或原始值代替。例如,函数返回状态时,不必总返回 { success: true, data: ... },可直接返回 data 或用 null/undefined 表示失败;需要布尔+值组合时,考虑用 [true, value] 这样的数组(轻量且不可变语义明确)。
- 字符串拼接、数值计算等中间结果,避免包装成对象(如不用
new String()或new Number()) - 配置项、常量对象定义在模块顶层,而非每次调用函数时
return { timeout: 5000, retries: 3 } - 事件处理器中需传参时,用闭包捕获变量,而非每次新建对象传入
addEventListener('click', () => handle({ id }))
谨慎使用类实例和工厂函数
类不是万能解药。如果对象生命周期短、状态简单、无共享行为,构造函数反而增加开销。比如工具函数中频繁生成的“坐标点”new Point(x, y),不如直接用 [x, y] 或复用单例对象(如 const ZERO_POINT = Object.freeze({ x: 0, y: 0 }))。
- 检查类是否有真正需要封装的状态和方法;若只有数据属性,考虑用
Object.assign()或展开语法复用已有对象 - 工厂函数内部避免重复
return new SomeClass(...),可结合对象池(尤其在动画、游戏循环中) - 对只读配置对象,用
Object.freeze()防止意外修改,也便于引擎优化
延迟初始化与按需生成
不少对象其实不会被用到,却在初始化阶段就被创建。把对象创建推迟到真正需要时,能显著降低首屏或高频调用路径的开销。
立即学习“Java免费学习笔记(深入)”;
- 将复杂对象赋值改为 getter:
get userInfo() { return this._userInfo || (this._userInfo = parseUser(data)); } - 组件或模块中,把非关键依赖(如日志器、上报客户端)设为惰性加载,首次调用才实例化
- 避免在循环内创建相同结构的对象,提取到循环外或用单个对象反复赋值(注意引用安全)
善用原型与静态方法减少实例膨胀
当多个实例共享相同逻辑,把方法挂载在原型上,而非在构造函数里为每个实例重复创建函数引用。同时,静态方法可直接操作参数,无需实例化。
- 不要在构造函数中写
this.handleClick = () => {...}(绑定导致新函数),改用原型方法 + 事件委托或bind提前处理 - 工具类尽量设计为无状态,所有方法声明为
static,调用时无需new Utils() - 对有默认行为的对象,用
Object.create(prototype)替代new,更轻量且可控
不复杂但容易忽略。真正影响性能的往往不是某一行 const obj = {},而是它出现在高频路径、嵌套循环或递归中。养成“这个对象现在必须是新的吗”的习惯,比追求语法糖更重要。


















