ES6 中的 super 关键字详解

阅读时长 5 分钟读完

在 ES6 中,我们可以通过 super 关键字来引用基类的方法或属性。这个关键字的使用可能与我们以前见过的一些语言中的 super 关键字有所不同,因此本文将详细介绍 ES6 中 super 关键字的用法、作用和注意事项。

1. 父类方法/属性的引用

对于继承的子类而言,super 常常用于引用父类中已经存在的方法和属性。这可以在子类中修改和扩展父类的属性及方法,并且子类可以引用父类中的属性和方法,而无需显式地指定继承层次结构。

1.1 引用父类方法

在子类中使用 super 引用父类中的方法时,可以使用 super 方法实现以下行为:

  • 直接调用父类中同名的方法。
  • 在子类方法中调用父类方法并传递参数。

以下是一个示例代码,可解释 super 在子类中引用父类方法的方式:

-- -------------------- ---- -------
----- ------ -
  ----------------- -
    --------- - -----
  -

  --------- -
    --------------- ---- -- ----------------
  -
-

----- ------- ------- ------ -
  ----------------- ------ -
    ------------ -- ------------ ---- ------
    ---------- - ------
  -

  --------- -
    ---------------- -- ------------
    ---------------- -- ----- -----------------
  -
-

----- ------- - --- ------------- ----- -----
------------------ -- -- --- ---- -- ---- ---- --- -- ----- ---

在上述示例中,我们创建了父类 Person 和子类 StudentPerson 类中定义了名为 sayName() 的方法, Student 类中覆盖了此方法,并在子类方法中调用父类方法。在这种情况下,在 Student 类中调用 sayName() 时,将执行以下操作:

  1. 通过 super 关键字引用父类中的 sayName() 方法。
  2. sayName() 方法输出字符串 "My name is John Doe."。
  3. 子类方法输出字符串 "I'm in Grade 5."。

1.2 引用父类属性

在子类中使用 super 引用父类属性时,可以使用 super 方法实现以下行为:

  • 直接引用父类中同名的属性。
  • 在子类的构造函数中为父类属性设置新的值。

以下是一个示例代码,可解释 super 在子类中引用父类属性的方式:

-- -------------------- ---- -------
----- ------ -
  ----------------- -
    --------- - -----
  -
-

----- ------- ------- ------ -
  ----------------- ------ -
    ------------ -- ------------ ---- ------
    ---------- - ------
    --------- - ------------- ----------- -- ---------
  -

  --- ------------- -
    ------ ------------- -- -- ----- ----------------
  -
-

----- ------- - --- ------------- ----- -----
--------------------------------- -- -- ----- --- --------- -- -- ----- ---

在上述示例中,我们创建了父类 Person 和子类 Student,并为父类属性设置了新的值。在子类方法中,我们可以通过在 super 父类中使用同名属性的方式访问该属性,并添加其他信息。

2.在 static 方法中的用法

static 方法中使用 super,它其实并不是指调用父类的方法或属性,而是调用父类的 static 方法或属性。

以下是示例代码,可解释在 static 方法中使用 super 的方式:

-- -------------------- ---- -------
----- ------ -
  ------ -------------- -
    ------ ---------
  -
-

----- ------- ------- ------ -
  ------ -------------- -
    ------ ------------------------ -----------
  -
-

------------------------------------ -- -- ------- ----------

在上述示例中,我们创建了一个父类和一个静态子类。在 Student 类中,我们定义了一个 static 方法 getClassName() 并重写它。我们使用 super.getClassName() 调用了 Person 类的静态 getClassName() 方法,并添加了一个后缀 (Student)

3.注意事项

  • super 关键字必须在子类构造函数中先调用 super() 方法,然后才能使用它来引用父类方法或属性。这保证了在任何子类方法之前都没有访问到 this 属性。
  • 在在静态方法中使用 super 时, super 指的是父类,而不是父类实例。
  • 在箭头函数中使用 super 不可行,因为箭头函数无法创建 this 作用域。

4.结论

在 ES6 中, super 关键字常常用于在子类中覆盖和调用父类中的方法和属性。这可以很好地扩展父类,以满足子类的需求。super 在使用中也需要注意其相关的作用和注意事项。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674d304fa336082f254a049e

纠错
反馈