asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

剖析ASP.NET AJAX的面向对象思想


发布日期:2023年08月29日
 
剖析ASP.NET AJAX的面向对象思想

人们期待已久的ASPNET AJAX v正式版终于发布了现在你能用Microsoft ASPNET AJAX的javascript很容易的写出丰富的交互式的web应用尤其值得关注的是Microsoft AJAX Library增加了面向对象的支持而以前javascript是不支持面向对象开发的现在icrosoft AJAX Library能很好的支持类名字空间继承接口枚举反射等特征这些新增加的功能类似于NET Framework这使得开发ASPNET AJAX应用变得容易维护容易扩充现在我们看看Microsoft AJAX Library是如何支持以上特征的

成员和名字空间

  在Microsoft AJAX Library中所有的JavaScript类都继承自object(类似于NET Framework库都继承自object)在ASPNET AJAX应用中你可以运用面向对象的编程模式创建继承自Microsoft AJAX基类的对象和组件类有四种成员字段属性方法事件字段和属性是名/值对用于描述一个类的一个实例的特性的字段是由简单类型构成且可直接访问例如

myClassInstancename=Fred

  属性可以是任何简单类型或引用类型通过get和set方法访问在ASPNET AJAX中get和set是独立的函数并规定在函数名中使用前缀get_set_ 例如要获取或设置cancel属性的值时你可以调用get_cancel或set_cancel方法

  一个方法是完成一个活动的函数而不是返回一个属性的值属性和方法在下面的例子里都有示范

  事件指示特指的动作发生当一个事件发生时它可以调用一个或多个函数事件所有者可以完成等待事件发生的任何任务

  名字空间是对关联类的逻辑分组名字空间使你可以对公共功能进行分组

  为了使ASPNET Web页面具有ASPNET AJAX功能你必须添加<asp:ScriptManager>控件到页面上当页面启动时参照ASPNET AJAX库的脚本自动产生

下面的例子显示了页面使用了<asp:ScriptManager>控件

  <asp:ScriptManager runat=server ID=scriptManager />

  下面的例子演示了如何使用TyperegisterNamespace和registerClass方法来把Person类增加到Demo名字空间中创建类然后注册类

TyperegisterNamespace(Demo);

DemoPerson = function(firstName lastName emailAddress) {

this_firstName = firstName;

this_lastName = lastName;

this_emailAddress = emailAddress;

}

DemoPersonprototype = {

getFirstName: function() {

  return this_firstName;

}

getLastName: function() {

  return this_lastName;

}

getName: function() {

  return this_firstName + + this_lastName;

}

dispose: function() {

  alert(bye + thisgetName());

}

}

DemoPersonregisterClass(DemoPerson null SysIDisposable);

  在脚本文件Namespacejs中定义了类Person制定了类的名字空间为Demo运行页面Namespaceaspx点击按钮将创建一个DemoPerson类的实例

访问修饰

  许多面向对象编程语言都有访问修饰的概念允许你指定类或成员在某种范围内有效例如可在外部执行的程序具有相同名字空间的内部类或特指的代码快内的类等在JavaScript中没有访问修饰但在ASPNET AJAX中约定以下划线字符开头_的被认为是私有的类的外部不能访问

继承

  继承是一个类派生于另一个类的能力派生类自动继承基类的所有字段属性方法和事件派生类可以增加新的成员或者重写基类已存在的成员来改变成员的行为

  下面的脚本实例有两个类Person和EmployeeEmployee从Person继承而来两个类示范了私有字段的使用它们都有公共属性方法另外Employee类重写了Person类的toString实现并调用了基类的功能

TyperegisterNamespace(Demo);

DemoPerson = function(firstName lastName emailAddress) {

this_firstName = firstName;

this_lastName = lastName;

this_emailAddress = emailAddress;

}

DemoPersonprototype = {

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 + thisgetName());

}

sendMail: function() {

  var emailAddress = thisgetEmailAddress();

  if (emailAddressindexOf(@) < ) {

    emailAddress = emailAddress + ;

  }

  alert(Sending mail to + emailAddress + );

}

toString: function() {

  return thisgetName() + ( + thisgetEmailAddress() + );

}

}

DemoPersonregisterClass(DemoPerson null SysIDisposable);

DemoEmployee = function(firstName lastName emailAddress team title) {

DemoEmployeeinitializeBase(this [firstName lastName emailAddress]);

this_team = team;

this_title = title;

}

DemoEmployeeprototype = {

getTeam: function() {

  return this_team;

}

setTeam: function(team) {

  this_team = team;

}

getTitle: function() {

  return this_title;

}

setTitle: function(title) {

  this_title = title;

}

toString: function() {

  return DemoEmployeecallBaseMethod(this toString) + \r\n + thisgetTitle() + \r\n + thisgetTeam();

}

}

DemoEmployeeregisterClass(DemoEmployee DemoPerson);

  Inheritancejs脚本文件中定义了两个类Person和EmployeeEmployee是从Person继承而来每个类都有字段公共属性和方法另外Employee类重写了toString的实现并在重写的代码中调用了基类的功能在这个例子中把类Person的名字空间设定为Demo运行页面Inheritanceaspx点击创建对象对象释放公共和私有属性对象方法重写方法对象类型检查体验一下

接口

  接口是类要实现的逻辑协议是对类进行集成的公共遵守的规范它能使多个类和同一个接口把实现定义和类的具体实现结合起来下面的例子定义了一个基类Tree和接口IFruitTreeApple和Banana这两个类实现了接口IFruitTree但Pine类没有实现接口IFruitTree

TyperegisterNamespace(DemoTrees);

DemoTreesIFruitTree = function() {}

DemoTreesIFruitTreePrototype = {

bearFruit: function(){}

}

DemoTreesIFruitTreeregisterInterface(DemoTreesIFruitTree);

DemoTreesTree = function(name) {

this_name = name;

}

DemoTreesTreeprototype = {

returnName: function() {

  return this_name;

}

toStringCustom: function() {

  return thisreturnName();

}

makeLeaves: function() {}

}

DemoTreesTreeregisterClass(DemoTreesTree);

DemoTreesFruitTree = function(name description) {

DemoTreesFruitTreeinitializeBase(this [name]);

this_description = description;

}

DemoTreesFruitTreeprototypebearFruit = function() {

  return this_description;

}

DemoTreesFruitTreeregisterClass(DemoTreesFruitTree DemoTreesTree DemoTreesIFruitTree);

DemoTreesApple = function() {

DemoTreesAppleinitializeBase(this [Apple red and crunchy]);

}

DemoTreesAppleprototype = {

makeLeaves: function() {

  alert(Mediumsized and desiduous);

}

toStringCustom: function() {

  return FruitTree + DemoTreesApplecallBaseMethod(this toStringCustom);

}

}

DemoTreesAppleregisterClass(DemoTreesApple DemoTreesFruitTree);

DemoTreesGrannySmith = function() {

DemoTreesGrannySmithinitializeBase(this);

// You must set the _description feild after initializeBase

// or you will get the base value

this_description = green and sour;

}

DemoTreesGrannySmithprototypetoStringCustom = function() {

return DemoTreesGrannySmithcallBaseMethod(this toStringCustom) + its GrannySmith!;

}

DemoTreesGrannySmithregisterClass(DemoTreesGrannySmith DemoTreesApple);

DemoTreesBanana = function(description) {

DemoTreesBananainitializeBase(this [Banana yellow and squishy]);

}

DemoTreesBananaprototypemakeLeaves = function() {

alert(Big and green);

}

DemoTreesBananaregisterClass(DemoTreesBanana DemoTreesFruitTree);

DemoTreesPine = function() {

DemoTreesPineinitializeBase(this [Pine]);

}

DemoTreesPineprototypemakeLeaves = function() {

alert(Needles in clusters);

}

DemoTreesPineregisterClass(DemoTreesPine DemoTreesTree);

  Interfacejs脚本文件中定义了一个Tree基类和一个IFruitTree接口Apple和Banana两个继承类实现了IFruitTree接口而Pine类没有实现IFruitTree接口运行Interfaceaspx点击对象创建接口检查调用接口方法体验一下

枚举

  枚举是包含一组被命名的正整数常数的类你可以像访问属性一样访问它的值例如

  lor = myColorEnumred枚举提供了一种很容易理解的整数表示下面的例子定义了一个以十六进制数表示的颜色被命名为有意义的名字的枚举类型

TyperegisterNamespace(Demo);

// Define an enumeration type and register it

DemoColor = function(){};

DemoColorprototype =

{

Red:  xFF

Blue:  xFF

Green: xFF

White: xFFFFFF

}

DemoColorregisterEnum(DemoColor);

  运行Enumerationaspx选择下拉框中的颜色脚本程序把背景色设为选中的枚举类型DemoColor中的颜色

反射

  反射用于检查一个运行期程序的结构和组成是通过类Type的API来实现反射的这些方法使你能够收集一个对象的信息例如它是继承于哪个类它是否实现类某个特指的接口它是否是某个类的实例等

  下面的例子用反射的API测试GrannySmith类是否实现了前面的接口运行Reflectionaspx点击检查类型检查继承检查接口体验一下

  另外需要说明的一点是Microsoft AJAX Library是基于开放体系架构而开发的不仅仅用于还能用于其它体系架构中例如用在java中

               

上一篇:ASP.NET入门随想之抽象的力量

下一篇:新手基础教程:ASP.NET2.0缓存技术