JavaScript 是一门基于对象的编程语言,因此对象在 JavaScript 中扮演着至关重要的角色。本文将深入探讨 JavaScript 对象的秘密,包括对象创建、原型链、继承和多态等内容,并提供示例代码。
对象创建
在 JavaScript 中,可以使用字面量或构造函数的方式来创建对象。例如,以下是使用字面量创建一个空对象的示例代码:
--- --- - ---
以下是使用构造函数创建对象的示例代码:
-------- ------------ ---- - --------- - ----- -------- - ---- - --- ------ - --- ------------ ----
使用字面量创建对象时,可以通过添加属性和方法来丰富对象的功能:
--- --- - - ----- ----- ---- --- --------- ---------- - -------------------------------------------------- - --
原型链
JavaScript 中的对象之间存在原型关系,每个对象都有一个隐藏的原型对象(__proto__
),该对象包含了该对象所属类的原型对象上的属性和方法。当访问一个对象的属性或方法时,如果该对象没有该属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法或者原型链的末尾。
以下是对象之间原型关系的示意图:
-------------- - ------ - -------------- - - --------- - -------------- - -------- - -------------- - - --------- - -------------- - ------ - -------------- - - --------- - -------------- - ------ - --------------
在上述示意图中,Object
是 JavaScript 内置的基础对象,所有对象都继承自 Object
对象。Function
是一种特殊的对象类型,用于创建其他对象。Person
是通过 Function
构造函数创建的对象类型,其原型对象是 Function.prototype
。person
是通过 Person
构造函数创建的对象,其原型对象是 Person.prototype
。
继承
JavaScript 中的继承可以通过原型链来实现。例如,以下是使用原型链实现继承的示例代码:
-------- ------------ - --------- - ----- - ------------------------- - ---------- - ----------------------------------- -- -------- --------- ------ - ----------------- ------ ---------- - ------ - ------------- - -------------------------------- ------------------------- - ---- ------------------ - ---------- - -------------------- -- --- --- - --- --------- ------ --------------- -- --------- ----------- -- ----
在上述示例代码中,Dog
继承自 Animal
,可以使用 Animal
中的方法和属性。通过 Object.create()
方法创建了一个新对象,并将其原型设置为 Animal.prototype
,这样 Dog.prototype
就成为了 Animal.prototype
的子类,从而实现了继承。同时需要修复 Dog.prototype.constructor
指向 Dog
构造函数。
多态
多态是面向对象编程中的一个重要概念,它允许不同的对象对同一消息作出不同的响应。在 JavaScript 中,可以通过覆盖父类中的方法来实现多态。例如,以下是使用多态实现不同动物叫的示例代码:
-------- ------------ - --------- - ----- - ------------------------- - ---------- - ------------------------- - ----------------------------------------------------------- -------- ---------------------------------------------------------------------------------------