new调用构造函数时,若return引用类型对象则直接返回该对象并丢弃新实例,导致原型链断裂、instanceof失效、constructor丢失;return原始值或null则被忽略,仍返回新实例;class与function行为一致,但更易引发隐蔽bug。

可以,但返回对象会彻底改变实例行为:new 表达式不再返回类的实例,而是直接返回你 return 的那个对象,导致原型链断裂、instanceof 失效、constructor 属性丢失。
constructor 返回对象时,实例就不是该类的实例了
只要 return 的是引用类型(普通对象、数组、函数、Date、Map 等),new 就放弃原本创建的实例,把 return 的值当作最终结果。这个返回值和原类完全脱钩:
- __proto__ 不指向类的 prototype:它继承的是所返回对象自身的原型(比如 return {} 时,__proto__ 指向 Object.prototype)
- instanceof 检查失败:new Example() instanceof Example → false
- constructor 属性不指向原类:返回对象没有 constructor === Example
- 原型方法不可用:Example.prototype 上定义的方法,在返回对象上调用会报错或 undefined
null 和原始值不会覆盖实例
return null、undefined、字符串、数字、布尔值、symbol 这些原始值,new 会忽略它们,照常返回新创建的实例:
- return null 是个常见误区——它不算对象,所以不触发覆盖
- return 'done' 或 return 42 同样被忽略,实例保持完整原型链
Class 与 function 构造函数的行为一致,但 class 更易踩坑
ES6 class 的 constructor 本质仍是函数,遵循相同的返回规则。区别在于:
- function 构造函数允许任意对象返回,运行时不报错(只悄悄丢弃实例)
- class 构造函数也允许,但逻辑更隐蔽——开发者容易默认“写了 class 就一定得到实例”
- 尤其在继承场景下,若子类 constructor return 了别的对象,super() 调用虽成功,但最终实例已脱离继承链
实际开发中要避免隐性覆盖
这不是语法错误,但极易引发难以定位的问题:
- 调试时发现方法调用失败,却查不到定义缺失——其实是对象根本没继承那些方法
- 条件返回(如缓存命中时 return cachedObj)必须确保返回对象具备完整接口,或手动修补原型
- 团队协作中,建议在 constructor 开头加注释说明是否主动返回,或用 TypeScript 类型系统约束返回值











