构造函数显式返回对象会切断原型链:new直接返回该对象,导致__proto__不指向构造函数prototype、instanceof失效、constructor丢失;返回原始值则忽略return,仍返回新实例。

构造函数的返回值会直接改变 new 表达式的最终结果,进而影响实例的原型链、类型判断和继承关系。关键不在“能不能 return”,而在于“return 什么”。
默认不写 return 或返回原始值
此时 new 会正常返回新创建的实例对象,this 上挂载的属性和方法都有效,原型链完整,instanceof 和 constructor 都准确指向原构造函数。
- 即使写了
return 123、return "ok"、return undefined,也等同于没写 return -
this.name = "张三"依然生效,对象能正常使用 - 子类继承时,父类构造逻辑执行完,实例仍属于子类和父类
显式 return 一个对象(含数组、函数、普通对象)
new 会立刻放弃原本创建的实例,直接把 return 的对象作为结果返回。这会导致:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 返回对象的
__proto__不指向构造函数的prototype -
obj instanceof Constructor返回false -
obj.constructor指向该对象自身构造器(如Object),不是原构造函数 - 原型上的方法(比如定义在
Constructor.prototype.say())无法访问
在继承中 return 对象后果更严重
比如 class Dog extends Animal,若 Dog 构造函数里 return { bark() {} }:
- 父类
Animal的初始化代码可能已运行(this.xxx = ...),但结果被丢弃 - 最终对象既不是
Dog实例,也不是Animal实例 - 多态失效:不能当作
Animal传入期望父类的地方 - 看似“创建成功”,实则类型契约断裂
为什么不要在构造函数里 return 对象
这不是语法错误,而是语义冲突:
- 构造函数的本质是“初始化 this”,不是“生成任意对象”
- 想返回定制对象,应改用工厂函数(如
createDog()),明确不走 new 流程 - 组合场景下,内部持有其他对象是合理的,但不该通过 return 把它“冒充”为当前类实例
- ES6 class 内部构造器同样遵循这套规则,return 对象也会破坏 extends 语义










