new 绑定在构造函数显式返回对象时会放弃默认创建的空对象而使用该返回值,若返回原始值或 null/undefined 则仍返回新创建的 this 对象;返回对象会导致原型链断裂和 instanceof 失效。

当构造函数显式返回一个对象时,new 绑定会放弃默认创建的空对象,转而使用该返回值作为最终实例。
构造函数默认返回 this(隐式)
若构造函数没有 return 语句,或只返回原始值(如 string、number、undefined、null、boolean),new 会忽略这些返回值,始终返回新创建的 this 对象。
-
function Foo() { this.x = 1; }→new Foo()返回{x: 1} -
function Bar() { this.y = 2; return 42; }→new Bar()仍返回{y: 2}(数字被忽略)
显式返回对象会覆盖 new 创建的对象
只要返回值是对象(包括数组、函数、正则、日期、Promise 等引用类型),new 就会直接把这个对象作为构造结果,不再使用内部生成的 this。
-
function Baz() { this.z = 3; return { a: 1 }; }→new Baz()返回{a: 1},z被丢弃 -
function Qux() { return [1, 2, 3]; }→new Qux()返回数组,不是实例
返回 null 或 undefined 不构成覆盖
虽然 null 是对象类型(历史遗留 bug),但 new 规范中明确将其视为“无返回”,等同于不返回,仍用默认 this。同理,undefined 也一样。
立即学习“Java免费学习笔记(深入)”;
-
function Quux() { this.w = 4; return null; }→new Quux()返回{w: 4} -
function Corge() { return undefined; }→ 效果同上,返回新对象
实际影响与注意事项
这种覆盖逻辑常被用于实现“构造函数工厂”或兼容旧 API,但容易引发隐式行为问题:
- 返回对象后,原型链断裂:
new Fn()返回 plain object,则instanceof Fn为false - 无法通过
constructor属性追溯来源(返回对象的constructor指向Object) - 建议仅在明确需要替代实例时返回对象,否则避免
return引用类型


















