new调用构造函数时,若返回引用类型则直接返回该值,否则隐式返回新创建的对象;原型链始终被构建,但仅当无对象返回时才暴露新实例。

当使用 new 调用构造函数时,JavaScript 会自动创建一个新对象,并将其作为 this 绑定到函数内部;如果构造函数没有显式返回对象,则隐式返回这个新对象。
new 绑定的四步执行过程
理解隐式返回,需先明确 new 的底层行为:
- 创建一个空的普通对象(即 `{}`)
- 将该对象的
[[Prototype]]指向构造函数的prototype - 以该对象为
this执行构造函数 - 判断构造函数的返回值:若返回的是对象(包括数组、函数、日期等引用类型),则直接返回该值;否则返回步骤 1 创建的新对象
隐式返回只在无对象返回时生效
构造函数是否“隐式返回”,取决于其 return 语句的返回值类型:
- 返回原始值(string/number/boolean/null/undefined) → 忽略返回值,仍返回新对象
- 返回引用类型(object/array/function/date/RegExp 等) → 覆盖默认行为,直接返回该对象
- 无 return 或 return;(即 undefined) → 隐式返回新对象
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
new Foo() // 返回新实例,不是 42
function Bar() { return {}; }
new Bar() // 返回 {},不是新实例
原型链与隐式返回无关
即使构造函数返回了另一个对象,新创建的对象及其原型链依然被构建出来,只是最终不暴露给调用者。也就是说,[[Prototype]] 设置和函数执行都会发生,但结果被 return 值覆盖。
这说明:隐式返回不是“省略了某步”,而是第 4 步的兜底逻辑,仅作用于返回值的最终选择。
避免意外覆盖的实践建议
为保持构造函数行为可预期,推荐:
- 构造函数尽量不写
return语句(除非明确需要返回自定义对象) - 若需返回特殊对象,应确保逻辑清晰,且文档注明该行为
- 对可能被
new调用的函数,可通过this instanceof Fn检查调用方式,统一处理返回值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










