5.6 对象的定义
5.6.1 抽象数据类型与面向对象
如果从形式上来定义 JavaScript 的对象,它就是一种属性的集合。所谓属性,即名称与值的配对。属性值可以被指定为任意类型的值,包括数组或其他的对象,都没有问题。
对于对象有一种很常见的定义,即它是一种数据和操作(子程序)的结合。这一定义可以理解为,将面向对象看作一种抽象数据类型的表现形式。
面向对象的 3 要素,即封装、继承与多态吧。如果这样理解的话,面向对象程序设计的焦点就在于对象的执行方式,并将执行方式的共性定义为一种类型。
在这一语境中,常常使用类这一术语来表达类型的含义。也有些语言会把执行方式与其实现分开,将执行方式定义为接口。接口的实例(实体)被称为对象,可以对其进行指定的操作。
5.6.2 实例间的协作关系与面向对象
另一种面向对象程序设计的观点认为,与其考虑执行方式之间的共性,更应该关注实例之间的协作关系,即所谓的对象是进行消息收发的实体。对象收到消息之后将会对其作出响应。从实现的角度来看,消息的实质就是通过对方法(函数)进行调用,将对消息的响应分派给方法来处理。从本质上来说,面向对象这一术语只不过是一种在高于内部实现的语境中所使用的、较为抽象的概念而已。打个比方,可以把消息当作一种通信协议,把对象当作一个 Web 应用。
5.6.3 JavaScript 的对象
JavaScript 语言所支持的面向对象与后者的理解更为相近。在JavaScript 中,一切都是对象。对象之间的协作(消息收发)通过属性访问(以及方法的调用)来实现。而对象之间的共性,则是通过继承同一个对象的性质的方式来实现。JavaScript通过基于原型的形式来实现继承。
一旦要对面向对象的概念进行说明,事情就会变得很抽象。如果只考虑具体该如何使用 JavaScript 的对象,就不必考虑那么多复杂的问题。只需要考虑最核心的内容,将其理解为在程序中可以进行操作的数据的一种扩充即可。此外,还可以通过函数方法的形式来表示对数据进行操作的子程序。这种想法的核心就是将对象的功能进行拆分并分别进行处理。分割本身也只不过是一种手段。毕竟,面向对象方法的最终目的是降低程序的复杂程度。