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

