最近因为学校做网站设计,所以一直在ASP上和数据库上大费苦心。我在前一个阶段是做Java程序设计的。突然接到任务并学习ASP,所以我一直都热忠并善于利用JavaScript来构架ASP程序。 JavaScript的一个明显的优点就在于它可以定义和持有自己的对象。这一点好象是VBScript所无法比拟的。有了这一点,可以利用JavaScript进行更接近于面向对象的程序设计。也许这将使网站开发更有乐趣... function Person() { public: // 注意这个public! this.GetName=Person_mfGetName; private: // 注意这个private! this.m_strName="Guest"; } function Person_mfGetName() { return this.m_strName; } var MyPerson=new Person(); MyPerson.GetName(); 注意上面的程序中的两个关键字:private 和 public。其实没有这样的用法,这只是我的习惯。 幸好在实际应用中不会有错。 function Student() // Extends Class: Person { EXTENDS: // 注意这个EXTENDS不能使用小写字母形式 this.Super=Person; // 定义指向其"父类构造器"。Super也不能用小写形式 this.Super(); // 调用其"父类构造器" private: this.m_nStudentID=0; } 使用EXTENDS这也是我的习惯,但要切记一定不能使用小写字母。因为extends是JavaScript中的保留字。 var MyStudent=new Student(); MyStudent.GetName(); // 调用"父类"的GetName(),结果为返回 "Guest" 关于JavaScript继承实现就是这样。只要牢记两步:
这样就可以继承“父类”的所有属性和方法! 继续关于JavaScript继承机制的讨论。 function Shape() { public: this.CalcuArea=Shape_mfCalcuArea; // 计算面积 } function Shape_mfCalcuArea() { // ... } 很明显的,这个Shape类下的CalcuArea()方法应该是个抽象函数。在Java中可以使用abstract关键字定义抽象函数,而在JavaScript中也没能支持这个特性。抽象函数不应该具有函数体,或者换句话说:在调用Shape.CalcuArea()时应该报错,并终止ASP脚本程序。从PHP程序设计中吸取一些设计经验,我们可以这样处理: function Shape_mfCalcuArea() { Response.Write("Error, Method Shape_mfCalcuArea Is Abstract"); Response.End(); } 这样做,就可以“迫使”自己在Shape的继承类中编写代码重载CalcuArea()方法。 function Rect() { EXTENDS: this.Super=Shape; this.Super(); OVERRIDE: this.CalcuArea=Rect_mfCalcuArea; } function Rect_mfCalcuArea() { // ... } 如果一个类中含有抽象函数,那么这个类必定是抽象类!抽象类是不能被实例化的,必须被子类继承。遗憾的是JavaScript也不支持抽象类定义(如果JavaScript真的支持“抽象类”机制,那么必定支持“继承”机制)。 function Shape() { Response.Write("Error, Class Shape Is Abstract"); Response.End(); // 其它代码 ... } var MyShape=new Shape(); // 会被告之出错 OK function Rect() { EXTENDS: this.Super=Shape; this.Super(); } var MyRect=new Rect(); // 仍会被告之出错 OH, NO 因为Shape是一个抽象类,所以在声明第一个MyShape对象时出现了警告。这是我们所期望的。而Rect类很好的继承了Shape类,但还是被告之“Error, Class Shape Is Abstract”。 function Shape() { if(!this.Super) { Response.Write("Error, Class Shape Is Abstract"); Response.End(); } // 其它代码 ... } var MyShape=new Shape(); // 会被告之出错 OK function Rect() { EXTENDS: this.Super=Shape; this.Super(); } var MyRect=new Rect(); // 顺利继承 YES, OK 在调用Shape构造器时,Shape类中根本就没定义this.Super成员变量,所以肯定要警告错误信息。而在Rect类中,首先就定义了this.Super的去向:就是指向Shape的构造器。所以在随后的函数调用中,Shape类构造器不会认为this.Super为空了,也就放行让我们通过了... 通过这些示例,我想你可以从中扩充更广的面向对象的特性。篇幅有限,至此收笔。 在文章结束的时候,我给出了一个运行于客户端的JavaScript脚本程序,可以通过查看页面源码来浏览。 <script language=JScript> // // 演示程序 function MSG() // MSG 抽象类定义 { ABSTRACT_CLASS: if(!this.Super) { document.write("Class MSG Is Abstract |
JavaScript继承机制模拟实现
最新推荐文章于 2024-05-07 16:45:26 发布