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

JS中new构造函数模式与工厂模式创建对象的有效性对比

构造函数模式与工厂模式的效率对比

两种实现代码

构造函数模式

function Point(x,y) {
  this.x = x
  this.y = y
}

Point.prototype.distSquared = function(p) {
  return (this.x - p.x) * (this.x - p.x) + (this.y - p.y) * (this.y - p.y)
}

工厂模式

function makePoint(x,y) {
  const distSquared = (p) => {
    return (point.x - p.x) * (point.x - p.x) + (point.y - p.y) * (point.y - p.y)
  }

  let point = {
    x,
    y,
    distSquared
  }

  return point
}

判断正确性

你提到的判断是完全正确的:

  • 构造函数模式中,distSquared函数仅在Point.prototype上定义一次,所有通过new Point()创建的实例都会共享这个原型上的函数,内存中只存在一份该函数的代码。
  • 工厂模式里,每次调用makePoint都会创建一个全新的distSquared箭头函数,每个返回的point对象都持有这个函数的独立副本,实例数量越多,重复的函数实例就越多。

内存消耗与性能的实际影响

内存消耗

  • 当创建的实例数量较少时(比如几十个以内),两种模式的内存差异几乎可以忽略,不会对应用造成任何影响。
  • 但如果需要创建大量实例(比如上万甚至数十万级),工厂模式的内存开销会显著高于构造函数模式——每个实例额外携带一份重复的函数代码,累计下来会占用更多堆内存,还可能导致垃圾回收(GC)更频繁地触发,影响应用稳定性。

性能表现

  • 函数调用性能:两种模式的函数调用效率差异极小,现代JS引擎对函数调用的优化已经非常成熟,几乎感知不到区别。
  • 属性查找性能:工厂模式的distSquared直接挂载在实例对象上,查找时无需遍历原型链,理论上比构造函数模式的原型链查找更快,但这种差异在普通业务场景下完全可以忽略,只有在超高频次调用的极端场景下才可能显现。
  • 另外,工厂模式中使用箭头函数捕获了point变量,虽然不改变内存开销的本质,但和构造函数模式中依赖this的函数相比,在this绑定上有本质区别,不过这属于语法特性差异,而非性能问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:43:27