JavaScript构造函数返回什么?

constructor方法是一个类的特殊方法,用于创建和初始化该类的对象。然而,在它的返回值方面涉及到一些魔法,特别是当涉及到它的返回值时。这种魔法并不是非常复杂,但它似乎经常让开发人员感到困惑。

通常情况下,当使用new调用构造函数时,会创建一个对象,将其构造函数分配给调用的构造函数,然后在执行构造函数方法中指定的任何操作之前,将对象分配给this。一旦代码执行完毕,构造函数将返回:

  • 任何有效的return值,有效值只能是object类型的值。
  • 如果没有执行带有有效值的return语句,则返回this对象。

让我们通过一些示例来更好地理解发生了什么:

class SimpleClass {
  constructor() {
    this.val = 0;
  }
}
new SimpleClass(); // { val: 0 }

class MyClass {
  constructor() {
    this.val = 0;
    return { a: 1, b: 2 };
  }
}
new MyClass(); // { a: 1, b : 2 }

上面的第一个示例显示了构造函数的默认行为,如果没有指定其他内容,则返回它的this对象。第二个示例展示了一个构造函数如何返回一个与this不同的对象,使用return语句。请注意,这种构造函数的用例通常是实现为单例或管理其实例数量的类,或类似的情况。

class VerboseClass {
  constructor() {
    this.val = 0;
    return this;
  }
}
new VerboseClass(); // { val: 0 }

class PrimClass {
  constructor() {
    this.val = 0;
    return 20;
  }
}
new PrimitiveClass();  // { val: 0 }

上面的两个例子都不是最佳的,原因各不相同。第一个例子太啰嗦了,因为this对象在构造函数中会隐式返回,所以没有必要显式地写return this。另一方面,第二个例子没有返回return语句的值,因为它不是一个object,所以构造函数会返回this对象。这可能会导致很多混淆,所以你应该避免这种情况。