gfreesky博客


    留下自己的脚印是一件很惬意的事:)
    博客园--美好愿望 美好生活......
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Microsoft AJAX Library中的面向对象简单介绍

Posted on 2008-10-30 11:33  gfreesky  阅读(416)  评论(0编辑  收藏  举报

这里只对Microsoft AJAX Library中的面向对象作简单介绍,包括如何定义类、成员、方法、接口、枚举等

如何定义一个类呢?

定义一个类第一步要注册命名空间,那如何注册呢?非常简单,看如下代码:

Type.registerNamespace("Mynamespace");

定义类是通过构造函数实现,看如下代码:

//注册类
Mynamespace.Employee = function(name) //定义一个类通过构造函数实现
{
    
this._name = name;
    
this._year = 0;
}


如何定义类的成员呢?

定义成员通过类的prototype来实现,看如下代码:

//定义成员通过prototype
Mynamespace.Employee.prototype=  //这里不能写成=fuction()
{
    
//同JSON比较=> { name : "jsky",sex : "女" }
    
    get_name : function() 
//不是function,括弧不能漏哦
    {
        
return this._name;
    },
    get_year : function()
    {
        
return this._year;
    },
    set_name : function(value)
    {
        
this._name=value;
    },
    set_year : function(value)
    {
        
this._year=value;
    },
    calculateSalary : function()
    {
        
return 1000 * (this._year);
    },
    getDescription : function()
    {
        
return String.format(
        
"{0} gets {1} yuan per month.",
        
this._name, //this关键字不能省
        this.calculateSalary());  //this关键字不能省
    }
}

分别定义了2个属性和2个方法,属性通过get_或set_进行定义,参照如上所示。

最后一步是注册这个类,看如下所示:

Mynamespace.Employee.registerClass("Mynamespace.Employee");

如何定义抽象类呢?

我们这么理解包含抽象方法的类视为抽象类,我们对calculateSalary做如下更改:

calculateSalary : function()
{
    
//定义抽象类,就是在函数内抛出异常
    throw Error.notImplemented(); 
}

这样Employee就成为了一个抽象类。

如何定义子类呢?

要定义一个类的子类,需要注意以下几个方面

1、实现父类的构造函数和抽象方法

2、注册类时带上父类的名

下面我们定义一个Employee的子类Intern,看看子类如何实现父类的构造函数以及如何调用父类的方法。

//定义子类--Intern
Mynamespace.Intern=function(name)
{
    
//子类一定要实现父类的构造函数
    Mynamespace.Intern.initializeBase(this,[name]);
}
Mynamespace.Intern.prototype
=
{
    
//子类一定要实现父类的抽象函数
    calculateSalary : function()
    {
        
return 2000;
    },
    getDescription : function()
    {
        
//子类如何调用父类的方法
        var description = Mynamespace.Intern.callBaseMethod(this,"getDescription");
        
return description + "what a poor intern!";
    }
}
Mynamespace.Intern.registerClass(
"Mynamespace.Intern",Mynamespace.Employee);


如何定义一个接口呢?

下面我们定义一个Employee的接口IEmployee,看如下代码:

/**************************** IEmployee 接口 ****************/
//定义一个接口IEmployee
Mynamespace.IEmployee = function()
{
    
throw Error.notImplemented();
}
Mynamespace.IEmployee.prototype
=
{
    calculateSalary : function()
    {
        
throw Error.notImplemented();
    } 
}
Mynamespace.IEmployee.registerInterface(
"Mynamespace.IEmployee");

注意注册时是注册接口而不是类,即registerInterface。

如何定义一个枚举呢?

下面我们来定义一个有关Employee的枚举,看如下代码所示:

/**************************** 枚举 **********************/
//定义一个枚举
Mynamespace.EmployeeType = function()
{
    
throw Error.notImplemented();
}
Mynamespace.EmployeeType.prototype 
= 
{
    Intern : 
0,
    Vendor : 
1,
    FulltimeEmployee : 
2
}
Mynamespace.EmployeeType.registerEnum(
"Mynamespace.EmployeeType");

注意最后注册的是枚举而不是类,别弄错了。

好了,下面我们看一个完整的例子,新建一个Js文件,取名Employee.js

Code


再看页面是如何使用的

<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
            
<Scripts>
                
<asp:ScriptReference Path="Employee.js" />
            
</Scripts>
        
</asp:ScriptManager>
        
<div id="info"></div>

        
<script language="javascript" type="text/javascript">
        function display(text)
        {
            document.getElementById(
"info").innerHTML += (text + "<br/>" );
        }
        var gsky 
= new Mynamespace.Intern("gsky");
        gsky.set_year(
3);
        display(gsky.getDescription());
        
        var tom 
= new Mynamespace.Vendor("tom");
        tom.set_year(
3);
        display(tom.getDescription());
        
        var jerry 
= new Mynamespace.FulltimeEmployee("jerry");
        jerry.set_year(
3);
        display(jerry.getDescription());
        
        display(
"gsky implements 'IEmployee' interface : " + 
        Mynamespace.IEmployee.isImplementedBy(gsky));
        
        display(String.format(
"{0} is a {1}",tom.get_name(),tom.get_type()));
        
        var type
=Mynamespace.EmployeeType.toString(tom.get_type());
        display(String.format(
"{0} is a {1}",tom.get_name(),type));
        
        var all
=Mynamespace.MyFlags.All;
        display(Mynamespace.MyFlags.toString(all)); 
// All
        
        display(Mynamespace.MyFlags.parse(
"Item1,Item3"));  //5
        
        
</script>

 

显示结果如下所示:

gsky gets 2000 yuan per month.what a poor intern!
tom gets 
7000 yuan per month.
jerry gets 
19000 yuan per month.what a excellent FulltimeEmployee!
gsky implements 
'IEmployee' interface : true
tom 
is a 1
tom 
is a Vendor
All
5

 

以上某些地方没做过多的细说,请对照以上代码参考相关资料,这里只做简单介绍。

以上代码注解若有不妥之处敬请指出!

谢谢拜读 :)

happy coding

happy everyday