当构造函数显式返回引用类型时,new 操作符直接返回该引用值而放弃原实例,导致原型链断裂、无法访问构造函数原型方法、instanceof和constructor失效,且父类初始化逻辑可能白执行。

当构造函数显式返回一个引用类型(如对象、数组、函数)时,new 操作符会直接返回该引用值,放弃原本创建的实例。这会导致几个关键现象:
原型链被切断
返回的对象不再通过 new 绑定构造函数的 prototype,它的 __proto__ 指向的是该返回值自身的构造器原型(比如 Object.prototype 或 Array.prototype),而不是原构造函数的 prototype。
- 无法访问构造函数原型上定义的方法和属性
- 即使构造函数内部已给
this赋值,这些属性也不会出现在最终返回的对象上
instanceof 和 constructor 失效
由于原型链断开,类型识别机制完全失效:
-
obj instanceof MyConstructor返回false -
obj.constructor通常指向Object(或对应引用类型的构造器),而非原构造函数 - 即便手动设置
constructor属性,也无法恢复原型关系
父类初始化逻辑可能白执行
在继承场景中(如 class Dog extends Animal),子类构造函数若 return 引用类型:
-
super()调用仍会执行,父类属性可能已写入临时this - 但最终对象与父类、子类都无 instanceof 关系
- 相当于“初始化做了,结果丢了”,既不是
Dog实例,也不是Animal实例
常见误用示例
以下代码看似创建了 Person 实例,实则返回一个独立对象:
function Person(name) {
this.name = name;
return { nickname: 'Jack' };
}
const p = new Person('John');
console.log(p.nickname); // 'Jack'
console.log(p.name); // undefined
console.log(p instanceof Person); // false


















