javascript|10.混合对象「类」( 三 )


建筑和蓝图之间的关系是间接的 。 你可以通过蓝图了解建筑的结构 , 对于建筑本身是无法获取这些信息的 。 但是如果你想打开一扇门 , 那就必须接触真实的建筑才行——蓝图只能表示门应该在哪 , 但并不是真正的门 。


蓝图只是一张纸 , 它不是真正的建筑 。
蓝图可以了解建筑的整体结构 , 而建筑本身反映建筑的整体结构则需要反推理 。
其实在编程做一个软件系统 , 写一本书、造一个房子 , 这些都是一样的 , 需要一个设计蓝图 , 然后根据蓝图来逐步完善 。 当然 , 作者在这里的蓝图仅仅指的是类的结构 , 在软件中更大的蓝图是软件系统的整体设计思路 。
一个类就是一张蓝图 , 为了获得真正可交互的对象 , 我们必须按照类来建造一个东西 , 这个东西通常被称为实例 , 有需要的话 , 我们可以直接在实例上调用方法并访问所有公有数据属性 。

介绍实例
这个对象就是类中描述的所有特性的一个副本 。

实例拥有类中所有的特性 , 以类的特性创建出来的副本 。
你走进一栋建筑时 , 它的蓝图不太可能挂在墙上 。 类似的 , 你通常不会使用一个实例对象来直接访问并操作它的类 , 不过你至少可以判断它来自哪个类 。

实例被创建出来后一般不会再用来访问类 。
把类和实例对象之间的关系看作是直接关系 , 而不是间接关系通常更有助于理解 。 类通过复制操作被实例化对象形式 。

实例与类之间的关系 , 是通过复制类里面的性质来成形 。
构造函数类实例是由一个特殊的类方法构造的 , 这个方法名通常和类名相同 , 被称为构造函数 。 这个方法的任务就是初始化实例需要的所有信息 。
举例来说 , 思考下面这个关于类的伪代码:
classCoolGuy{
specialTrick=nothing
GoolGuy(trick){
specialTrick=trick

showOff(){
output('Here is my trick: 'specialTtick)


我们可以调用类构造函数来生成一个 CoolGuy 实例:
Joe=newCoolGuy('jumping rope')
Joe.showOff()// 这就是我的绝技 , 跳绳

注意:CoolGuy 类有一个 CoolGuy() 构造函数 , 执行 new CoolGuy() 时实际上调用的就是它——构造函数 。 构造函数会返回一个对象(也就是类的实例) , 之后我们可以在这个对象上调用 showOff 方法 , 来输出指定 CoolGuy 的特长 。
类构造函数属于类 , 而且通常和类同名 。 此外 , 构造函数大多需要用 new 来调用 , 这样语言引擎才知道你想要构造一个新的类实例 。

这里的构造函数是介绍的面向对象的构造函数 。
多态Car 重写了继承自父类的 drive() 方法 , 但是之后 Car 调用了 inherited.drive() 方法 , 这表明了 Car 可以引用继承来原始 drive() 方法 。 快艇的 pilot() 方法同样引用了原始的 drive() 方法 。
这个技术被称为多态或虚拟多态 。 在本例中 , 更恰当的说法是相对多态 。
多态是一个非常广泛的话题 , 我们现在所说的「相对」只是多态的一个方面:任何方法都可以引用继承层次中高层的方法 。 之所以说「相对」是因为我们并不会想要访问的绝对继承层次 , 而是使用相对引用「查找上一层」 。
在许多语言中可以使用 super 来替代本例中的 inherited:它的含义是「超类」superclass , 表示当前类的父类或者祖先类 。
多态的另一个方面是 , 在继承链的不同层次中一个方法名可以被多次定义 , 当调用方法时会自动选择合适的定义 。