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
对象。这可能会导致很多混淆,所以你应该避免这种情况。