构造函数显式返回对象时,new 表达式返回该对象而非默认 this;返回原始值或不返回时,则返回填充后的 this。此机制用于单例、代理、构建器等场景,手写 new 需模拟该逻辑。

构造函数返回对象会直接覆盖 new 默认创建并绑定的实例,最终 new 表达式返回的是你显式 return 的那个对象,而不是原本生成的 this 对象。
return 对象时:this 被完全丢弃
当构造函数中使用 return 语句返回一个对象(包括数组、函数、正则、日期等引用类型),new 就不再返回它内部创建的那个空对象,而是直接把 return 的值作为结果返回。此时,this 上添加的所有属性、方法全部失效。
- function Person() { this.name = 'Alice'; return { age: 25 }; }
- const p = new Person(); // p 是 { age: 25 },不是 { name: 'Alice' }
- p.name → undefined;p.age → 25
return 原始值或不 return:this 正常生效
如果 return 的是字符串、数字、布尔、null、undefined 等原始值(或干脆没写 return),JavaScript 会忽略该 return,继续返回 new 内部创建并填充后的 this 对象。
- function User() { this.id = 1; return 'ignored'; }
- const u = new User(); // u 是 { id: 1 },不是 'ignored'
- function Empty() { return null; }
new Empty() → {}(空对象,因为 this 没被赋值,但 new 仍返回它)
这个机制的实际用途
它让构造函数具备了“灵活出口”的能力,常见于单例封装、代理对象、构建器模式等场景。
立即学习“Java免费学习笔记(深入)”;
- 统一返回某个预设对象,实现两个构造函数产出同一实例:let cache = {}; function A() { return cache; } function B() { return cache; } new A() === new B() → true
- 根据条件返回不同类型的对象,绕过原型链继承:if (mode === 'fast') return new FastImpl(); else return new SafeImpl();
- 构造函数内做兼容处理,比如对旧浏览器返回 polyfill 实例
手写 new 时必须模拟这一逻辑
自己实现 myNew 时,不能只返回新创建的对象,还要检查构造函数执行后的返回值是否为对象类型:
- 用 typeof result === 'object' && result !== null 判断是否为有效对象
- 满足条件就返回 result;否则返回自己创建的 obj
- 注意:函数也是 object 类型,所以也属于“可覆盖返回”的范畴


















