在TypeScript中,从子类调用基类的构造函数是通过
super
关键字实现的。当你在子类中定义一个构造函数时,你必须首先调用
super()
,这会执行基类的构造函数。在调用
super()
之后,你可以在子类构造函数中执行其他初始化操作。
这是面向对象编程中的一个常见模式,用于确保继承的类正确地初始化了其基类部分。
假设我们有一个基类
Person
,它有一个构造函数,该构造函数接受
name
作为参数:
class Person {
name: string;
constructor(name: string) {
this.name = name;
现在,我们创建一个Employee
类,它继承自Person
。我们希望Employee
类接受一个额外的参数employeeID
,但同时也需要从Person
类继承name
属性。这就是我们如何做到的:
class Employee extends Person {
employeeID: number;
constructor(name: string, employeeID: number) {
super(name); // 调用基类(Person)的构造函数
this.employeeID = employeeID;
在这个例子中,Employee
类的构造函数首先通过super(name)
调用了Person
类的构造函数,传递了name
参数。这确保了Employee
实例的name
属性被正确初始化。之后,Employee
类的构造函数继续设置employeeID
属性。
当你在子类中定义构造函数时,调用super()
是必需的,即使基类没有定义构造函数。如果基类没有显式定义构造函数,它会有一个默认的空构造函数,你仍然需要在子类构造函数中调用super()
。
super()
调用必须是子类构造函数中的第一条语句。这是因为在基类的构造函数执行完成之前,子类的实例尚未被初始化,所以你不能在调用super()
之前访问this
。
通过这种方式,TypeScript(和ES6的类)支持基于类的面向对象编程中的继承和构造函数调用,允许开发者构建复杂的类层次结构。