1

假设我们有两个函数,如下所示:

function a(){ this.x = 5; return {z:20};} 
function b(){ this.x = 5; return 30;} 

现在,如果您运行这些行,一切似乎都是合理的:

a(); //output : {z:20} 
b(); //output : 30; 

但是如果您将它们作为对象构造函数运行:

new a() //output : Object {z:20} 
new b() //output : b {x:5} 

我不明白new构造函数是否应该总是返回一个对象,为什么行为不同?JavaScript 会观察返回类型吗?如果返回类型是一个对象,那么直接返回它,如果不是,它返回启动的实例?

我认为如果它是一个构造函数,那么它应该总是忽略返回类型并返回启动的对象。我认为这种行为使 JavaScript 过于复杂。这里还有什么我不明白的吗?

4

1 回答 1

2

我不明白新的构造函数是否应该总是返回一个对象,为什么行为不同?JavaScript 会观察返回类型吗?如果返回类型是一个对象,那么直接返回它,如果不是,它返回启动的实例?

基本上是的。如果函数的返回值不是对象,则new运算符返回this(新对象)(实际上是内部[[Construct]]方法执行此操作)。

我认为如果它是一个构造函数,那么它应该总是忽略返回类型并返回启动的对象。我认为这种行为使 JavaScript 过于复杂。这里还有什么我不明白的吗?

这真的是一个更主观的意见。优点是构造函数可以决定返回不同的值,这使得它更加灵活。另一方面,我认为不返回值比反过来更常见。

于 2014-03-05T23:31:23.240 回答