人們期待已久的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中
From:http://tw.wingwit.com/Article/program/net/201311/13099.html