ECMAScript 2021 中的继承和原型链详解

阅读时长 6 分钟读完

ECMAScript 是一种广泛使用的脚本语言,常用于编写 Web 应用程序。在 ECMAScript 2021 中,继承和原型链是其中最重要的概念之一。

继承

继承是一种面向对象编程的概念,它允许一个对象获取另一个对象的属性和方法。在 ECMAScript 中,继承可以通过使用 extends 关键字来实现。

基本语法

下面是一个简单的示例,演示如何使用 extends 关键字来实现继承:

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

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

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

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

在上面的代码中,我们定义了一个名为 Animal 的类,并在其中定义了一个 speak 方法。然后,我们定义了一个名为 Dog 的类,并使用 extends 关键字将其继承自 Animal 类。最后,我们创建了一个 Dog 类的实例,并调用其 speak 方法。

super 关键字

在子类中,可以使用 super 关键字来调用父类的方法。下面是一个示例:

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

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

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

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

在上面的代码中,我们在 Dog 类的 speak 方法中调用了父类的 speak 方法。

继承原生对象

在 ECMAScript 中,可以继承原生对象(如 ArrayDate 等)。下面是一个示例:

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

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

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

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

在上面的代码中,我们定义了一个名为 MyArray 的类,并将其继承自 Array 类。然后,我们定义了 firstlast 属性,并在 constructor 方法中调用了父类的 constructor 方法。

原型链

在 ECMAScript 中,每个对象都有一个指向其原型的指针。原型是一个对象,它包含了对象的属性和方法。当我们访问一个对象的属性或方法时,如果该对象本身没有该属性或方法,JavaScript 引擎将查找该对象的原型,以确定是否存在该属性或方法。如果该属性或方法存在于原型中,则它将被返回。如果该属性或方法不存在于原型中,则引擎将继续查找原型的原型,直到找到该属性或方法为止。这就是所谓的原型链。

原型

在 ECMAScript 中,每个对象都有一个原型。我们可以使用 Object.getPrototypeOf 方法来获取一个对象的原型。下面是一个示例:

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

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

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

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

在上面的代码中,我们定义了一个名为 animal 的对象,并在其中定义了一个 eats 属性。然后,我们定义了一个名为 rabbit 的对象,并在其中定义了一个 jumps 属性。最后,我们将 rabbit 对象的原型设置为 animal 对象,并使用 Object.getPrototypeOf 方法来检查 rabbit 对象的原型是否为 animal 对象。

原型继承

在 ECMAScript 中,我们可以使用原型继承来实现继承。下面是一个示例:

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

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

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

在上面的代码中,我们定义了一个名为 animal 的对象,并在其中定义了一个 eats 属性。然后,我们定义了一个名为 rabbit 的对象,并在其中定义了一个 jumps 属性。最后,我们将 rabbit 对象的原型设置为 animal 对象,并使用 rabbit.eats 来访问 animal 对象的属性。

原型链继承

在 ECMAScript 中,我们可以使用原型链继承来实现继承。下面是一个示例:

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

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

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

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

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

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

在上面的代码中,我们定义了一个名为 Animal 的构造函数,并在其中定义了一个 eats 属性。然后,我们定义了一个名为 Dog 的构造函数,并在其中定义了一个 barks 方法。最后,我们将 Dog 的原型设置为 Animal 的原型,并使用 Object.create 方法来创建一个新对象,该对象的原型为 Animal 的原型。

结论

在 ECMAScript 2021 中,继承和原型链是非常重要的概念。掌握这些概念可以帮助你更好地理解 JavaScript 中的面向对象编程。如果你想深入了解这些概念,建议你阅读相关的文档和书籍,并编写一些示例代码来练习。

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

纠错
反馈