ES2015构造函数的返回值是多少?

时间:2018-09-07 05:12:04

标签: javascript ecmascript-6 javascript-objects

最初提出这个问题是因为我试图使用JSDoc记录ES2015类,并正确记录该类的构造函数,我需要知道返回值及其类型,我意识到我不知道。在研究它时,我找不到在Stack Overflow上被问到的问题,所以我四处寻找ES2015类,新运算符和构造函数的详细信息。我已经找到了我认为可能的答案,但是认为将问题连同我发现的内容一起发布在SO上,看看其他人是否可以确认或有更好的答案可能会有所帮助。

为演示该问题,假设一个人具有以下代码:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

var mySquare = new Rectangle(10, 10);
console.log(mySquare);//output: Object { height: 10, width: 10 }

一个人永远不会直接或显式地调用构造函数,也不会显式地从中返回任何内容,但是显然它被调用了,它必须返回 something 。那么,构造函数的返回值是什么?什么是返回值?

为了使事情变得更加困难,不能像我一开始那样简单地调用构造函数并检查返回值的类型:

console.log(typeof mySquare.constructor(11, 11));//output: TypeError: class constructors must be invoked with |new|
console.log(typeof Rectangle.prototype.constructor(12, 12));//output: TypeError: class constructors must be invoked with |new|

1 个答案:

答案 0 :(得分:3)

根据new operator上MDN的引用:

  

执行代码new Foo(...)时,会发生以下情况:

     
      
  1. 创建一个新对象,该对象继承自Foo.prototype。
  2.   
  3. 使用指定的参数调用构造函数Foo,并将其绑定到新创建的对象。 new Foo等同于new Foo(),即,如果未指定参数列表,则调用Foo时不带参数。
  4.   
  5. 构造函数返回的对象成为整个新表达式的结果。 如果构造函数未明确返回对象,则使用在步骤1中创建的对象。 (通常,构造函数不返回值,但是如果他们想覆盖普通的对象创建过程,则可以选择这样做。)
  6.   

(强调我的。)因此,似乎构造函数的返回值是一个对象,更具体地说是类的实例。

进一步的研究表明,可以通过从构造函数中显式返回任何对象来覆盖构造函数的返回值(尽管非对象返回值将被忽略,在这种情况下,将使用新创建的对象引用的默认值) 。)我找不到任何迹象表明ES2015构造函数与ES2015类之前的构造函数有所不同。

This Stack Overflow post在研究上述内容方面非常有帮助,特别是this article包含一个链接,尽管由于constructor既没有出现在问题中也没有出现在代码中,我对研究此问题的构造函数的了解有限,起初似乎并没有回答我的问题。希望这可以为处于相同情况的其他人澄清。

编辑:MDN信息的准确性在评论中受到质疑,因此我研究了更确定的信息来源。 ECMA规范对构造函数说:

  

构造函数是支持[[Construct]]内部方法的对象。

然后定义as follows[[Construct]]内部方法:

  

签名:(任意对象列表)→对象

     

描述:创建一个对象。通过new或super运算符调用。内部方法的第一个参数是包含运算符参数的列表。第二个参数是新运算符最初应用于的对象。实现此内部方法的对象称为构造函数。函数对象不一定是构造函数,此类非构造函数函数对象没有[[Construct]]内部方法。

该规范指出,在描述上述签名时,使用以下convention:“如果内部方法显式返回一个值,则其参数列表后跟符号“→”和类型返回值的名称。”

总而言之,根据上面引用的ECMA规范,是的,构造函数实际上确实会返回对象。