构造函数默认返回新创建的实例;若显式返回对象则覆盖该实例,返回原始值(含null、undefined)则被忽略。

JavaScript 构造函数的返回值确实会影响 new 表达式的最终结果,但规则很明确:只有显式返回一个对象(包括数组、函数、正则、日期等引用类型),才会覆盖默认创建的实例;返回原始值(string、number、boolean、null、undefined)会被忽略,仍返回新创建的实例。
构造函数默认返回什么?
当你用 new Foo() 调用时,引擎会:
- 创建一个空对象,继承自
Foo.prototype - 将该对象作为
this绑定到Foo执行 - 若构造函数没有
return,或返回原始值,则自动返回这个新对象
什么时候返回值会“生效”?
仅当构造函数显式 return 一个对象类型值时,new 的结果才是它:
-
return {}→ 返回空对象,不是new出来的实例 -
return new Date()→ 返回日期对象,与Foo无关 -
return document.createElement('div')→ 返回 DOM 元素 -
return [1, 2]或return /abc/同样生效(都是对象)
注意:return null 或 return undefined 等同于没写 return,仍返回新实例。
立即学习“Java免费学习笔记(深入)”;
常见误区:想返回原始值来“控制实例”
这是无效的:
-
return 42→ 被忽略,仍得实例 -
return 'hello'→ 被忽略 -
return false→ 被忽略
如果真需要“替代返回”,必须返回对象。例如实现单例、代理、或封装原生类型:
function Logger(name) {
this.name = name;
// 想统一返回某个预设对象?
if (name === 'main') {
return { log: console.log.bind(console, '[MAIN]') };
}
}
const a = new Logger('main'); // a 是那个对象,不是 Logger 实例
const b = new Logger('other'); // b 是正常的 Logger 实例
实用建议
- 除非有明确设计意图(如工厂式构造、兼容旧 API),否则避免在构造函数中
return对象,易造成行为不一致 - 想做初始化逻辑,直接操作
this即可 - 需要灵活返回不同类型的场景,更推荐用普通工厂函数(
createLogger()),语义更清晰 - ES6 类(
class)中constructor不能return非对象值,否则报错(严格模式下)


















