new表达式返回值由return决定:返回引用类型则替换新实例并断裂原型链,否则返回新实例;this始终指向新实例且不可变。

构造函数显式返回一个新对象时,this本身没变,但new 表达式的最终结果被替换了,原型链随之断裂——这不是“转变”,而是“替换与丢弃”。
构造函数内的 this 始终指向新实例
只要用 new 调用,引擎第一步就创建空对象,并把 this 绑定到它身上。这发生在函数体执行前,不可覆盖。
- 哪怕你写
return { name: 'Jack' },this.name = 'Tom'这行依然执行,属性确实写进了新对象 - 但这个新对象不会被返回,它在 return 后就被丢弃了,对调用者完全不可见
- this 在整个函数执行过程中,始终是那个被丢弃的新对象,不是 return 的那个
new 的返回值由 return 类型决定
new 不关心 this 怎么用,只看 return 的值是不是引用类型(除 null 外):
- 返回对象、数组、函数、正则、日期等 → new 结果就是该返回值
- 返回 string/number/boolean/undefined/null → 忽略 return,仍返回新实例
- 没写 return 或写
return;→ 等价于return undefined,返回新实例
原型链断裂的三个表现
一旦返回新对象,原构造函数和新对象之间就彻底脱钩:
-
obj instanceof Constructor变成false -
obj.constructor指向Object(或对应构造器),不再是原构造函数 -
obj.__proto__不指向Constructor.prototype,原型上的方法无法访问
常见误用场景与建议
这种写法容易引发隐性 bug,除非有明确设计意图,否则应避免:
- 不要在构造函数里 return 字面量对象(如
{}、[]),尤其在继承链中 - 若需返回定制对象,建议改用工厂函数,语义更清晰,也不破坏 instanceof
- 调试时注意:打印 this 和最终返回值可能不同,别混淆两者
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











