当构造函数显式返回对象时,new 表达式直接返回该对象并忽略默认实例,因 new 的第四步规范规定:返回值为非 null 对象时优先使用该值;null 和原始值均不生效,且原型链不继承原构造函数。

当构造函数显式返回一个对象时,new 表达式会直接把这个对象作为最终结果返回,而忽略原本创建的那个实例对象。这不是“覆盖 this”,而是返回值优先级的规则——this 的指向早在构造函数执行时就已确定,但外部拿到的值由返回逻辑决定。
为什么返回对象会“替换”实例?
这是 new 的第四步行为规范:只要返回值是对象(包括数组、函数、正则、日期等引用类型),就跳过默认返回的新对象,改用该返回值。
- null 是例外:虽然 typeof null === 'object',但它不是对象类型,所以 return null 仍返回实例
- 原始值一律被忽略:return 123、return 'hello'、return undefined 都不影响结果
- this 不受影响:即使 return {},构造函数内部的 this 依然指向新创建的对象,只是这个对象没被返回出去
常见误判场景
容易混淆的是“看起来像实例”的返回值,比如:
-
return this;→ 看似多余,实则安全:this 就是新实例,等价于默认返回 -
return new Date();→ 返回全新 Date 实例,与原构造函数无关 -
return { name: 'jack' };→ 返回纯对象,无法访问原构造函数 prototype 上的方法
手写实现中如何判断?
关键在返回值检测逻辑,必须同时满足两个条件:
- typeof result === 'object'
- result !== null
缺一不可。例如:
const isObject = typeof result === 'object' && result !== null;只有 isObject 为 true,才返回 result;否则返回新创建的对象。
原型链是否继承?
不继承。显式返回的对象,其 __proto__ 指向 Object.prototype(除非手动设置),跟原构造函数的 prototype 完全无关。这意味着:
- 它无法调用 Person.prototype.sayHi()
- 它不是 Person 的实例:
returnedObj instanceof Person === false - 它只是一个普通对象,只是被 new 表达式“选中”作为返回值

















