日期:2011-01-03  浏览次数:20465 次

    人们期待已久的ASP.NET AJAX v1.0正式版终于发布了。现在你能用Microsoft ASP.NET AJAX的javascript很容易的写出丰富的、交互式的web应用。尤其值得关注的是Microsoft AJAX Library增加了面向对象的支持,而以前javascript是不支持面向对象开发的。现在icrosoft AJAX Library能很好的支持类、名字空间、继承、接口、枚举、反射等特征。这些新增加的功能类似于.NET Framework,这使得开发ASP.NET AJAX应用变得容易维护,容易扩充。现在我们看看Microsoft AJAX Library是如何支持以上特征的。
1.类、成员和名字空间
    在Microsoft AJAX Library中,所有的JavaScript类都继承自object(类似于.NET Framework库,都继承自object),在ASP.NET AJAX应用中你可以运用面向对象的编程模式创建继承自Microsoft AJAX基类的对象和组件,类有四种成员:字段、属性、方法、事件。字段和属性是名/值对,用于描述一个类的一个实例的特性的。字段是由简单类型构成且可直接访问,例如:
myClassInstance.name="Fred"。
    属性可以是任何简单类型或引用类型,通过get和set方法访问。在ASP.NET AJAX中,get和set是独立的函数,并规定在函数名中使用前缀"get_" 或 "set_" ,例如要获取或设置cancel属性的值时,你可以调用get_cancel或set_cancel方法。
    一个方法是完成一个活动的函数而不是返回一个属性的值。属性和方法在下面的例子里都有示范。
    事件指示特指的动作发生。当一个事件发生时,它可以调用一个或多个函数。事件所有者可以完成等待事件发生的任何任务。
    名字空间是对关联类的逻辑分组。名字空间使你可以对公共功能进行分组。
    为了使ASP.NET Web页面具有ASP.NET AJAX功能,你必须添加<asp:ScriptManager>控件到页面上,当页面启动时,参照ASP.NET AJAX库的脚本自动产生。
下面的例子显示了页面使用了<asp:ScriptManager>控件。
    <asp:ScriptManager runat="server" ID="scriptManager" />
    下面的例子演示了如何使用Type.registerNamespace和.registerClass方法来把Person类增加到Demo名字空间中、创建类然后注册类。
Type.registerNamespace("Demo");

Demo.Person = function(firstName, lastName, emailAddress) {
  this._firstName = firstName;
  this._lastName = lastName;
  this._emailAddress = emailAddress;
}

Demo.Person.prototype = {

  getFirstName: function() {
    return this._firstName;
  },

  getLastName: function() {
    return this._lastName;
  },

  getName: function() {
    return this._firstName + ' ' + this._lastName;
  },

  dispose: function() {
    alert('bye ' + this.getName());
  }
}
Demo.Person.registerClass('Demo.Person', null, Sys.IDisposable);

    在脚本文件Namespace.js中定义了类Person,制定了类的名字空间为"Demo"。运行页面Namespace.aspx,点击按钮将创建一个Demo.Person类的实例。

2.访问修饰
    许多面向对象编程语言都有访问修饰的概念。允许你指定类或成员在某种范围内有效。例如可在外部执行的程序、具有相同名字空间的内部类或特指的代码快内的类等。在JavaScript中没有访问修饰,但在ASP.NET AJAX中约定以下划线字符开头"_"的被认为是私有的,类的外部不能访问。
3.继承
    继承是一个类派生于另一个类的能力。派生类自动继承基类的所有字段、属性、方法和事件。派生类可以增加新的成员或者重写基类已存在的成员来改变成员的行为。
    下面的脚本实例有两个类Person和Employee,Employee从Person继承而来,两个类示范了私有字段的使用,它们都有公共属性、方法。另外Employee类重写了Person类的toString实现,并调用了基类的功能。
Type.registerNamespace("Demo");

Demo.Person = function(firstName, lastName, emailAddress) {
  this._firstName = firstName;
  this._lastName = lastName;
  this._emailAddress = emailAddress;
}

Demo.Person.prototype = {
  getFirstName: function() {
    return this._firstName;
  },

  getLastName: function() {
    return this._lastName;
  },

  getEmailAddress: function() {
    return this._emailAddress;
  },
  setEmailAddress: function(emailAddress) {
    this._emailAddress = emailAddress;
  },

  getName: function() {
    return this._firstName + ' ' + this._lastName;
  },

  dispose: function() {
    alert('bye ' + this.getName());
  },

  sendMail: function() {
    var emailAddress = this.getEmailAddress();

    if (emailAddress.indexOf('@') < 0) {
        emailAddress = emailAddress + '@example.com';
    }
    alert('Sending mail to ' + emailAddress