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

JavaScript中构造函数与返回对象的函数的区别及选型指南

构造函数与返回对象的函数的区别及选型建议

核心区别

1. 原型链与继承能力

构造函数通过new关键字创建的实例,会自动关联构造函数的prototype原型对象,具备原型链继承的能力。而返回对象的函数(工厂函数)返回的是普通对象,没有绑定到任何自定义原型上,无法继承原型上的方法。

比如给构造函数的原型添加方法,实例可以直接调用:

setupOptionsConstructor.prototype.logData = function() {
  console.log(this.data);
}
two.logData(); // 输出123
// one.logData(); // 执行会报错,因为one是普通Object实例,没有这个方法

2. 实例类型标识

用instanceof可以判断构造函数创建的实例归属:

console.log(two instanceof setupOptionsConstructor); // true
console.log(one instanceof setupOptionsObj); // false
console.log(one instanceof Object); // true(所有对象都是Object的实例)

工厂函数返回的对象只能被识别为普通Object,无法关联到创建它的函数。

3. 变量封装与访问权限

你的示例里,工厂函数的num是通过闭包捕获的,外部无法直接修改;而构造函数的this.data是实例的公开属性,外部可以直接修改:

one.data = 456;
console.log(one.func()); // 还是输出1230(因为func用的是闭包的num)
two.data = 456;
console.log(two.func()); // 还是1230(你的示例里func用的是参数num,不是this.data,如果改成return this.data*10,修改two.data就会影响结果)

如果构造函数里的方法改用this.data,外部修改就会生效,这是两者在状态管理上的差异。

4. 内存占用

如果把构造函数的方法挂载到prototype上,所有实例会共享这一个方法副本,节省内存;而工厂函数每次调用都会创建新的方法实例,每个对象都有独立的方法拷贝,创建大量对象时内存消耗更高。

比如优化后的构造函数:

function setupOptionsConstructor(num) {
  this.data = num;
}
setupOptionsConstructor.prototype.func = function() {
  return this.data * 10;
}
// 所有new出来的实例共享同一个func方法

开发中的选型考量

选工厂函数(返回对象的函数)的场景

  • 不需要继承、原型链相关特性,只想快速创建独立的轻量对象
  • 调用更直观,不需要写new关键字,降低调用出错概率
  • 需要封装私有变量,避免外部直接修改内部状态

选构造函数的场景

  • 需要实现对象间的继承关系,或基于原型扩展公共方法
  • 需要让实例有明确的类型标识,方便用instanceof做类型判断
  • 要创建大量同类型对象,通过原型共享方法来优化内存占用

内容的提问来源于stack exchange,提问作者Anya M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 08:24:52