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

