JavaScript 编程精解 中文第三版 六、对象的秘密

JavaScript 是一门基于对象的编程语言,因此对象在 JavaScript 中扮演着至关重要的角色。本文将深入探讨 JavaScript 对象的秘密,包括对象创建、原型链、继承和多态等内容,并提供示例代码。

对象创建

在 JavaScript 中,可以使用字面量或构造函数的方式来创建对象。例如,以下是使用字面量创建一个空对象的示例代码:

--- --- - ---

以下是使用构造函数创建对象的示例代码:

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

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

使用字面量创建对象时,可以通过添加属性和方法来丰富对象的功能:

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

原型链

JavaScript 中的对象之间存在原型关系,每个对象都有一个隐藏的原型对象(__proto__),该对象包含了该对象所属类的原型对象上的属性和方法。当访问一个对象的属性或方法时,如果该对象没有该属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法或者原型链的末尾。

以下是对象之间原型关系的示意图:

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

在上述示意图中,Object 是 JavaScript 内置的基础对象,所有对象都继承自 Object 对象。Function 是一种特殊的对象类型,用于创建其他对象。Person 是通过 Function 构造函数创建的对象类型,其原型对象是 Function.prototypeperson 是通过 Person 构造函数创建的对象,其原型对象是 Person.prototype

继承

JavaScript 中的继承可以通过原型链来实现。例如,以下是使用原型链实现继承的示例代码:

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

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

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

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

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

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

在上述示例代码中,Dog 继承自 Animal,可以使用 Animal 中的方法和属性。通过 Object.create() 方法创建了一个新对象,并将其原型设置为 Animal.prototype,这样 Dog.prototype 就成为了 Animal.prototype 的子类,从而实现了继承。同时需要修复 Dog.prototype.constructor 指向 Dog 构造函数。

多态

多态是面向对象编程中的一个重要概念,它允许不同的对象对同一消息作出不同的响应。在 JavaScript 中,可以通过覆盖父类中的方法来实现多态。例如,以下是使用多态实现不同动物叫的示例代码:

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

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

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