4.3.2 xbObjects
Netscape的DevEdge站点(http://devedge.netscape.com)有许多对Web开发者有用的信息和脚本工具。工具之一是xbObjects(可以从http://archive.bclary.com/xbProjects- docs/xbObject/处下载),由Netscape公司的Bob Clary于2001年Netscape 6(Mozilla 0.6)发布时编写而成。它支持从那时起的所有Mozilla版本及其他现代浏览器(IE、Opera和Safari)。
1. 目的
xbObjects的目的是为JavaScript提供更强的面向对象范型,不止支持继承,还支持方法的重载和调用超类方法的能力。要实现这一点,xbObjects需执行许多步。
第一步,必须注册类,此时,需定义它是由哪个类继承而来。用下面的调用可以实现这一点:
![]()
![]()
这里,子类和超类名都以字符串形式传进来,而不是指向它们的构造函数的指针。这个调用必须放在指定子类的构造函数前。
如果新的类未继承任何类,调用registerClass()时也可以只用第一个参数。
第二步,在构造函数内调用defineClass()方法,传给它类名及被Clary称为原型函数(prototype function)的指针,该函数用于初始化对象的所有属性和方法(之后会介绍更多),例如:

可以看到,原型函数(prototypeFunction())位于构造函数内部。它的主要用途是在适当的时候把所有方法赋予该类(在这一点上与动态原型相似)。
下一步(迄今为止是第三步)是为该类创建init()方法。该方法负责设置该类的所有属性,它必须接受与构造函数相同的参数。作为一种规约,init()方法总是在defineClass()方法后调用。例如:

你可能已注意到init()方法中调用的parentMethod()方法。xbObjects以这种方式允许类调用它的超类的方法。parentMethod()方法接受任意多个参数,但第一个参数总是要调用的父类方法的名字(该参数必须是字符串,而不是函数指针),所有其他参数都被传给父类的方法。
在这个例子中,首先调用init()方法,这是xbObjects运行所必需的。即使ClassA未注册超类,xbObejcts都会为它创建一个所有类的默认超类,即超类方法init()所属的类。
第四步也是最后一步,在原型函数内添加其他类的方法:

然后,即可以以常规方式创建ClassA的实例:
![]()
2. 重载多边形
此时,你一定想知道是否可以用xbObjects重写多边形的例子,下面就是重写后的代码。
首先,重写Polygon类,非常简单:
![]()

![]()
![]()
接下来,重写Triangle类,是这个例子中第一个真正用到继承的类:

注意在构造函数之前调用registerClass(),并建立继承关系。此外,init()方法的第一行调用超类的init()方法,参数是3,把sides属性设置成3。余下的就是为base和height属性赋值。
Rectangle类与Triangle类类似:
![]()


该类与Triangle类之间的主要区别(除registerClass()和defineClass()类的调用外)是调用超类方法init()的参数是4。然后,添加length属性和width属性,覆盖getArea()方法。







