You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

疑问:JavaScript中返回对象的函数无法作为构造函数是否成立?

你的假设基本正确,但需要补充更精准的细节说明

首先直接给结论:你的核心观察是对的,但我们需要明确JavaScript构造函数的返回值规则,才能完整理解这个现象:

在JavaScript中,new操作符调用构造函数时,背后的逻辑大致是这样的:

  1. 创建一个新的空对象,这个对象会继承构造函数的prototype
  2. 将这个新对象绑定为构造函数中的this
  3. 执行构造函数的代码
  4. 关键步骤:判断构造函数的返回值类型
    • 如果返回的是对象类型(包括普通对象、数组、函数、正则表达式等),new会直接返回这个显式返回的对象,之前创建的this实例会被丢弃
    • 如果没有返回值,或者返回的是原始类型值(字符串、数字、布尔值、null、undefined),new会返回之前创建的绑定了this的实例

结合你的代码来看:

  • 对于test函数:

    function test(x) { this.x = x; return {}; }
    

    它显式返回了一个空对象,所以new test(1)得到的就是这个空对象,自然访问x属性会得到undefined。

  • 对于test1函数:

    function test1(x) { this.x = x; }
    

    没有显式返回值,所以new test1(1)返回的是绑定了x=1的实例,因此x属性的值是1。

我们再补充一个返回原始类型的例子,验证规则:

function test2(x) {
  this.x = x;
  return "hello"; // 返回原始类型字符串
}
console.log(new test2(1).x); // 输出 1,因为原始类型返回值会被忽略,依然返回this实例

所以更准确的说法是:当构造函数显式返回对象类型值时,new操作符会返回该对象,而非默认的实例;但它依然是一个合法的构造函数,只是返回结果被显式返回的对象覆盖了。

内容的提问来源于stack exchange,提问作者SPS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:02:51