在面向对象编程中,继承是一个非常重要的概念。在 JavaScript 中,通过原型链实现继承机制。从 ES6 开始,引入了 class 关键字来更方便地创建类,并且引入了 super 关键字来调用父类的构造函数和方法。
类与继承的基本概念
在 JavaScript 中,类是基于原型的继承机制的一种语法糖。使用 class 关键字可以定义一个类,而类之间的继承则通过 extends 关键字来实现。
-- -------------------- ---- -------
-- ------
----- ------ -
----------------- -
--------- - -----
-
------- -
------------------------- ----- - ---------
-
-
-- ------
----- --- ------- ------ -
-- ---
-在这个例子中,Dog 类通过 extends 关键字继承了 Animal 类。
使用 super 调用父类构造函数
当一个子类继承自一个父类时,子类的构造函数中需要调用父类的构造函数来初始化继承自父类的属性。这时就需要使用 super 关键字。需要注意的是,super() 必须在子类构造函数中的 this 关键字之前被调用。
-- -------------------- ---- -------
----- --- ------- ------ -
----------------- ------ -
------------ -- ---------
---------- - ------
-
------- -
------------------------- ---------
-
-
----- ----- - --- ---------- ------- -----------
------------------------ -- --- ---
------------------------- -- --- ------ --------
-------------- -- --- --- ------在这个例子中,super(name) 调用了父类 Animal 的构造函数,从而初始化了 name 属性。然后,Dog 类的构造函数继续初始化自己的属性 breed。
调用父类的方法
除了构造函数之外,super 还可以用来调用父类的其他方法。这在子类需要扩展或修改父类行为的情况下特别有用。
-- -------------------- ---- -------
----- --- ------- ------ -
----------------- ------ -
------------
---------- - ------
-
------- -
-------------- -- ----- ----- --
------------------------- ---------
-
-
----- ----- - --- --------------- --------
-------------- -- --- -------- ----- - ------ -------- ------在这个例子中,super.speak() 被用来调用父类 Animal 的 speak 方法。然后子类 Cat 继续执行自己的逻辑,输出 purrs。
使用 super 调用父类静态方法
除了实例方法之外,super 还可以用来调用父类的静态方法。静态方法可以通过类名直接调用,而不是通过实例。
-- -------------------- ---- -------
----- ---- ------- ------ -
----------------- ------- -
------------
----------- - -------
-
------ -------------- -
------ ----------- - ------------- -- -------- - ------------- ------ ------
-
-
----- ------ ------- ---- -
----------------- ------- -
----------- --------
-
------ ---------------- -
------ ---------------------- - - -------------- -- ---- ---- -- ---------
-
-
----- -------- - --- --------------- ------
--------------------------------------- -- --- ----- -- ------- ----- -- ---- ---- -- -------在这个例子中,super.isFlying(parrot) 调用了父类 Bird 的静态方法 isFlying。然后子类 Parrot 继续执行自己的逻辑,输出额外的信息。
总结
通过 super 关键字,JavaScript 提供了一种简洁而强大的方式来处理继承中的构造函数调用和方法调用。这使得子类能够轻松地扩展或修改父类的行为,同时保持代码的清晰和可维护性。