疑问:JavaScript中返回对象的函数无法作为构造函数是否成立?
你的假设基本正确,但需要补充更精准的细节说明
首先直接给结论:你的核心观察是对的,但我们需要明确JavaScript构造函数的返回值规则,才能完整理解这个现象:
在JavaScript中,new操作符调用构造函数时,背后的逻辑大致是这样的:
- 创建一个新的空对象,这个对象会继承构造函数的
prototype - 将这个新对象绑定为构造函数中的
this - 执行构造函数的代码
- 关键步骤:判断构造函数的返回值类型
- 如果返回的是对象类型(包括普通对象、数组、函数、正则表达式等),
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
相关产品推荐
相关产品推荐

