> 3) .在类的实例当中注册事件函数。
这一部分不作评论,自己去看dom 2的事件模型。
> 2。继承。
> 刚采用了大篇幅的文字去介绍如何实现javascript的各种实现,也就是从逻辑上完成了一个封装class的实现,从某种意义上来说,class的实现是真正脚本编程中使用最多的部分,不过如果只是要完成如上的功能,使用vbscript来编写更能更加清晰,毕竟vbscript提供了class关键字,同时提供了public 和private这两个关键字,可以清晰的将公共和私有对象分离,至于事件的实现,也可以采用类似javascript实现的思路,只是对于函数的引用需要采用getref这个函数,具体的用法可以参考scripting reference,msdn里头也有详细的介绍,而javascript强大至于在于如下要说的了,虽然具体的东西可能不多。
关于vbs我只说一句:vbs是m$牌的垃圾。
> 上述代码实现了newtimer类,从timer继承,javascript没有使用“:”或者java的public那样类似的关键字,只是通过newclassname.prototype=new baseclass这样的方法来完成,同时newtimer实现了getsystemdate的方法,在newtimer的初始化函数中,我使用了this.base=timer,是为了引用父类的实现,不过在对于父类其他实现函数的调用,到现在我没有找到一个确定的方法,是否通过this.base.start()那样来调用还是其他的,如果有谁比较清楚的,麻烦告诉我,另外在netscape的站点上,我查到有一个特殊的"__proto__"的属性好像是对于父类的直接引用,不过具体的我也没有尝试过,在msdn中也没有看到对于__proto__的支持。
之所以不是像其他语言那样继承,那是因为这根本不是“真正”的继承,因为js根本没有“真正”的类,呵呵。prototype的实质就是对原型对象的一个引用。至于调用“父类”方法,其实很简单,在调用了“父类”的构造函数之后直接调用就是了。至于为什么用this.base=parent,其实想明白一件事情就很简单了。parent实际上并不是类,而是构造函数。在“子类”构造函数内部,当时还没有原型存在(prototype是外部动态赋值的,不是静态信息)。所以必须手动的获取“父类”构造函数,运行一下。
也许有人要问,那既然子类直接运行父类构造函数,干吗还要原型?把所有东西写在构造函数不就结了?嘿嘿,想想作者的“第二种方法”。prototype有个特性,给原型增加一个属性(包括方法),所有继承这个原型的对象都会自动添加这个属性。因此,如果你要用这个特性,还是需要原型的。至少你可以用instanceof操作符来判断变量的类型。
__proto__可以被检测和回溯,从而形成一个原型链,这在比较复杂的“类结构”里是有用的,你可以用它来写自己的instanceof。不过这不是ecma规范要求的,也应该仅仅在语言内部使用(你真的需要在子类里去动态改变父类?)。
> 3。重载
> 或许这个是oop编程中比较复杂的地方了,在javascript的实现中有点无奈,也就是通过prototype的方式来完成的,不过因为我不清楚如何调用父类的实现函数,那么在重载中只能够重新编写所有的实现了,另外就是在实现中实例化一个父类,然后通过调用它来返回需要的东西。
这个无奈只是作者杞人忧天 :)