构造函数显式返回对象会覆盖new创建的this实例,返回原始值则忽略返回值并返回this;应避免意外返回对象,优先使用class语法以规避该陷阱。

构造函数中主动返回一个对象,会覆盖 new 操作符默认创建并绑定的 this 实例——这不是“灾难”,而是 JavaScript 明确定义的行为。关键在于理解规则,并主动规避或合理利用它。
构造函数返回值的规则必须清楚
new 调用时,若构造函数显式 return 一个对象类型(包括数组、函数、正则等),那么 new 表达式最终返回的就是这个对象,原始的 this 实例被丢弃;若 return 的是原始值(null、undefined、数字、字符串等),则 new 忽略该返回值,仍返回新创建的 this 实例。
- return {} / [] / /./ / function(){} → new 结果 = 这个返回值
- return 42 / 'hello' / null / undefined / true → new 结果 = 新建的 this 实例
避免意外覆盖 this 的常见写法
多数情况下,你并不想让构造函数返回别的对象——尤其当类有原型方法、需要 instanceof 判断、或依赖 this 初始化时。最稳妥的做法是:不写 return,或只在必要时 return this(显式强调)。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 删掉所有不必要的 return 语句
- 如果必须提前退出(如校验失败),用 throw 抛错,而不是 return {}
- 若需链式调用,return this,而非 new Object()
有意利用返回值的场景与风险
少数情况会主动 return 对象,比如实现单例、代理封装、或兼容旧 API。但要注意:
- 返回的对象不再继承构造函数的 prototype,instanceof 会失效
- 原型上的方法无法访问,除非手动挂载或使用 Object.setPrototypeOf
- this 在构造函数内已完成初始化,但最终被丢弃,可能造成资源浪费或副作用
用 class 语法天然规避大部分陷阱
ES6 class 的 constructor 不允许 return 非 undefined 的对象(严格模式下会报错),强制保持 new 绑定语义。如果项目支持,优先用 class 替代 function 构造器。
注意:class 中若 return {},运行时直接抛出 TypeError —— 这其实是保护机制,不是限制。










