ES6 class 继承可能遇到的问题及解决方案

阅读时长 5 分钟读完

ES6 引入了 class 语法,使得创建对象更加简便明了。然而,当使用 class 继承时,有些问题需要注意和处理。

问题一:super 要在 this 之前调用

在使用 class 继承时,在子类的 constructor 中必须先调用 super() 才能使用 this 关键字,否则会抛出错误。

下面是一个例子:

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

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

解决方法:确保 super() 调用在 this 关键字之前。

问题二:覆盖父类方法后无法调用

在子类中重写(覆盖)父类方法时,如果需要在子类方法中调用父类方法,则必须使用 super 关键字进行调用。如果直接使用 this 关键字调用父类方法,则会抛出错误。

下面是一个例子:

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

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

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

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

解决方法:在子类方法中使用 super 关键字调用父类方法。

问题三:无法将子类实例化为父类

虽然子类继承于父类,但是构造函数不同,子类的实例不能当做父类的实例来使用。即使子类只是添加了一些属性或者方法,也不会被自动继承到父类实例中。

下面是一个例子:

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

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

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

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

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

解决方法:如果需要让子类实例可以转换成父类实例,可以使用 Object.setPrototypeOf() 方法将子类实例的原型设置为父类的实例。

总结

使用 ES6 class 继承时,需要注意上述三个问题。要在子类 constructor 中先调用 super() ,要在覆盖父类方法时使用 super ,同时要注意子类实例和父类实例的转换问题。

希望这篇文章能够帮助您更加深入理解 ES6 class 的继承机制,遇到问题也可以及时处理并解决。

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

纠错
反馈