第2章 深入学习JavaScript对象与数组 对象是JavaScript最基本的数据类型之一,是一种复合的数据类型,它将多种数据类型集中在一个数据单元中,同时允许通过对象名来存取这些数据的值。数组是JavaScript中唯一用来存储和操作有序数据集的数据结构。本章主要介绍对象与数组的基本概念和基础知识。 2.1 了 解 对 象 在JavaScript中,对象包括内置对象、自定义对象等多种类型,使用这些对象,可大大简化JavaScript程序的设计,并提供直观、模块化的方式进行脚本程序开发。 2.1.1 什么是对象 对象(Object)是一件事、一个实体、一个名词,是可以获得的东西,是可以想象有自己标识的任何东西。对象是类的实例化。有些对象是活的,有些对象不是。以自然人为例,我们来构造一个对象,其中Attribute表示对象属性,Method表示对象行为,如图2-1所示。 在计算机语言中也存在对象,可以定义为相关变量和方法的软件集。对象主要由下面两个部分组成。 (1)一组包含各种类型数据的属性。 (2)允许对属性中的数据进行的操作,即相关方法。 以HTML文档中的document对象为例,其中包含各种属性和方法,如图2-2所示。 图2-1 对象的属性和行为 图2-2 以HTML文档中的document 为例构造的对象 凡是能够提取一定的度量数据,并能通过某种方式对度量数据实施操作的客观存在都可以构成一个对象。可以用属性来描述对象的状态,使用方法和事件来处理对象的各种行为。 (1)属性。用来描述对象的状态,通过定义属性值来定义对象的状态。在图2-1中,定义了字符串Nationality来表示人的国籍,所以Nationality成为人的某个属性。 (2)方法。针对对象行为的复杂性,对象的某些行为可以用通用的代码来处理,这些代码就是方法。在图2-2中,定义了Open()方法来处理文件的打开情况。 (3)事件。由于对象行为的复杂性,对象的某些行为不能使用通用的代码来处理,需要用户根据实际情况来编写处理该行为的代码,该代码称为事件。 JavaScript是基于对象的编程语言,除循环和关系运算符等语言构造之外,其所有的特征几乎都是按照对象的方法进行处理的。 JavaScript支持的对象主要包括以下4种。 (1)JavaScript核心对象。包括基本数据类型的相关对象(如String、Boolean、Number)、允许创建用户自定义和组合类型的对象(如Object、Array)和其他能简化JavaScript操作的对象(如Math、Date、RegExp、Function)。 (2)浏览器对象。包括不属于JavaScript语言本身但被绝大多数浏览器所支持的对象,如控制浏览器窗口和用户交互界面的Window对象、提供客户端浏览器配置信息的Navigator对象。 (3)用户自定义对象。Web应用程序开发者用于完成特定任务而创建的自定义对象,可自由设计对象的属性、方法和事件处理程序,编程灵活性较大。 (4)文本对象。由文本域构成的对象,在DOM中定义,同时赋予很多特定的处理方法,如insertData()、appendData()等。 2.1.2 面向对象编程 面向对象程序设计(Object-Oriented Programming,OOP)是一种起源于20世纪60年代的Simula语言,其自身理论已经十分完善,并被多种面向对象程序设计语言实现。面向对象编程的基本原则是:计算机程序由单个能够起到子程序作用的单元或对象组合而成。面向对象编程具有3个最基本的特点:重用性、灵活性和扩展性。这种方法将软件程序中的每一个元素作为一个对象看待,同时定义对象的类型、属性和描述对象的方法。为了实现整体操作,每个对象都应该能够接收信息、处理数据和向其他对象发送信息。 面向对象编程主要包含如下3个重要的概念。 1.继承 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。继承性是面向对象程序设计语言不同于其他语言的最重要的特点,是其他语言所没有的。继承主要分为以下两种类型。 (1)在类层次中,子类只继承一个父类的数据结构和方法,则称为单重继承。 (2)在类层次中,子类继承多个父类的数据结构和方法,则称为多重继承。 在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,简化了对象、类的创建工作量,增加了代码重用性。 继承性提供了类规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。 2.封装 封装的作用是将对象的实现过程通过函数等方式封装起来,使用户只能通过对象提供的属性、方法和事件等接口去访问对象,而不需要知道对象的具体实现过程。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口——特定的访问权限来使用类的成员。 封装允许对象运行的代码相对于调用者来说是完全独立的,调用者通过对象及相关接口参数来访问此接口。只要对象的接口不变,即使对象的内部结构或实现方法发生了改变,程序的其他部分也不用做任何处理。 3.多态 多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象收到同一消息可以产生不同的结果,这种现象称为多态性。多态性允许每个对象以适合自身的方式去响应共同的消息。多态性增强了软件的灵活性和重用性。 需要说明的是:JavaScript脚本是基于对象的脚本编程语言,而不是面向对象的编程语言。其原因在于:JavaScript是以DOM和BOM中定义的对象模型及操作方法为基础的,但又不具备面向对象编程语言所必须具备的显著特征,如分类、继承、封装、多态、重载等。另外,JavaScript还支持DOM和BOM提供的对象模型,用于根据其对象模型层次结构来访问目标对象的属性并对对象施加相应的操作。 在JavaScript语言中,之所以任何类型的对象都可以赋予任意类型的数值,是因为JavaScript为弱类型的脚本语言,即变量在使用前无须任何声明,在浏览器解释运行其代码时,才检查目标变量的数据类型。