构造函数中返回非null对象会覆盖new创建的实例,导致原型链断裂、instanceof失效、constructor丢失;返回基本类型无影响;class中return基本类型会报错,应改用工厂函数。

构造函数中返回对象,会直接覆盖 new 创建的默认实例,导致原型链断裂、instanceof 失效、constructor 属性丢失——这是唯一真正破坏面向对象语义的行为。
返回对象会替换整个实例
当构造函数显式 return 一个非 null 的对象(包括 {}、[]、new Date()、正则字面量等),new 操作符就放弃原本创建的实例,直接返回你 return 的那个对象。
- 该对象的 __proto__ 不再指向构造函数的 prototype,而是指向 Object.prototype 或对应内置类型的原型;
- instanceof 构造函数结果为 false,因为原型链上找不到构造函数的 prototype;
- constructor 属性不再指向原构造函数,例如 return {} 后,obj.constructor === Object;
- 构造函数 prototype 上定义的方法和属性,新对象无法访问。
返回基本类型完全无影响
return 字符串、数字、布尔值、null、undefined、symbol 或 bigint,new 都会忽略该返回值,照常返回新创建的实例。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- this 绑定依然有效,所有 this.xxx 赋值正常挂载到实例上;
- 实例仍继承构造函数 prototype,instanceof 和 constructor 正常;
- 不写 return,或只写 return;(等价于 return undefined),效果相同。
class 构造器中返回对象会报错
ES6 class 的 constructor 方法不允许返回非对象值:若显式 return 对象,运行时不会报错;但若 return 基本类型(如 return 42),直接抛出 TypeError。
- 这是 class 语法对构造函数行为的强化约束,避免意外覆盖实例;
- 本质仍是 same underlying rule:只有返回对象才改变结果,但 class 把“返回原始值”从静默忽略升级为显式拒绝;
- 因此 class 中应避免任何 return 语句,或确保只在明确需要工厂逻辑时改用普通函数。
真正该用工厂函数的场景
如果你确实需要返回定制对象(比如单例、代理包装、缓存实例),不要依赖 new + return,而应使用显式的工厂函数。
- 工厂函数语义清晰:调用即返回目标对象,不依赖 new 的隐式规则;
- 可自由返回任意类型,无需担心原型链被意外切断;
- 与 class 兼容性好,也便于单元测试和依赖注入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










