new表达式最终返回对象由构造函数返回值类型决定:返回原始值(string/number/boolean/null/undefined/Symbol/BigInt)会被忽略,仍返回新实例;仅当显式返回非null对象(含数组、函数、正则等)时,才替换默认实例并导致原型链断裂、instanceof失效。

JavaScript 中构造函数的返回值会直接影响 new 表达式最终得到的对象,但影响方式取决于返回值的类型——不是所有 return 都会改变结果,只有返回“对象”才真正接管实例创建过程。
返回原始值(string/number/boolean/null/undefined)完全被忽略
这类值包括字符串字面量、数字、布尔值、null、undefined,甚至 Symbol 或 BigInt。无论你写 return 42、return "ok" 还是 return undefined,new 都会无视它,照常返回新创建的实例对象。
- 实例的
constructor仍指向原构造函数 -
instanceof判定正常,原型链完整 - 所有在
this上定义的属性和方法都可用
返回对象(含数组、函数、正则、Date 等引用类型)会替代默认实例
只要 return 后跟的是一个对象(即 typeof x === "object" 且不为 null),new 就会丢弃原本构建的 this 实例,直接把该对象作为结果返回。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 返回的对象不再继承原构造函数的
prototype -
instanceof OriginalConstructor为false - 原构造函数中对
this的赋值(如this.name = ...)全部失效 - 常见陷阱:返回字面量
{}、[]、/reg/或new Date()
class 语法下返回对象会直接报错
ES6 class 的构造器不允许显式返回对象。如果你在 constructor() 中写 return {x: 1},运行时会抛出 TypeError。
立即学习“Java免费学习笔记(深入)”;
- 这是语言层面的限制,旨在强制保持类实例的语义一致性
- 想实现类似效果(如返回代理、单例、包装对象),应改用工厂函数
- 普通 function 构造函数虽允许,但属于反模式,建议避免
如何快速判断 return 值是否会影响 new 结果
在构造函数内加一行调试即可:
console.log(typeof returnValue, returnValue instanceof Object)- 若输出
"object" true→ 会被采纳,原型链断裂 - 若输出
"string" false或"number" false→ 被忽略,安全 - 注意:
null的typeof是"object",但它不会触发替换(JS 引擎特殊处理)

















