| 最近因为学校做网站设计,所以一直在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脚本程序,可以通过查看页面源码来浏览。
|
JavaScript继承机制模拟实现
最新推荐文章于 2025-12-29 10:47:54 发布
博客涉及JavaScript、function、class、ASP、VBScript、include等信息技术相关内容,这些元素在编程开发中有着重要作用,JavaScript是前端常用语言,ASP和VBScript常用于后端开发等。
2071

被折叠的 条评论
为什么被折叠?



