new调用构造函数时返回基本类型不会导致行为畸变:显式返回原始值会被忽略,仍返回新实例;仅返回对象才会破坏原型链、instanceof和constructor。

不需要避免——返回基本数据类型根本不会导致 new 行为畸变。这是对 JavaScript 构造函数返回规则的常见误解。
new 对返回值的实际处理逻辑
当用 new 调用构造函数时,JavaScript 的行为是确定且稳定的:
- 如果构造函数 显式 return 一个对象(含数组、函数、正则、Date 等引用类型),new 就直接返回那个对象,丢弃原本创建的实例;
- 如果 return 的是 任何原始值(string / number / boolean / null / undefined / symbol / bigint),new 会完全忽略该 return,照常返回新创建的实例;
- 不写 return,或只写
return;(等价于return undefined;),也属于“返回原始值”,同样被忽略。
所谓“畸变”其实并不存在
所谓“返回基本类型导致行为异常”,往往源于两个混淆:
- 误把
return 42当成会改变实例类型或破坏原型链——实际它毫无影响,new Foo()仍是Foo实例,instanceof和原型方法都正常; - 把“返回对象导致的畸变”错误泛化到所有 return 场景——但只有返回对象才真正改变 new 的结果,原始值永远安全。
真正该警惕的是返回对象
这才是唯一会破坏面向对象契约的行为:
-
instanceof判定失效(返回的对象不继承构造函数 prototype); - 原型上的方法无法调用;
-
constructor属性丢失; - 与
class语法冲突(class 构造器中 return 非对象会直接报错)。
实用建议
日常开发中只需记住一条铁律:
- 构造函数里 不要 return 任何对象(包括字面量
{}、[]、/./等); - return 原始值或不 return,都是安全的,无需规避;
- 若需要定制返回对象(如单例、代理、包装实例),改用工厂函数(如
createFoo()),而非依赖 new + return。











