[转]AS语言基础
┏━━━━━━━━━━━━━━━━━━┓
┃ 第一部分:ActionScript 3 語言基礎 ┃
┗━━━━━━━━━━━━━━━━━━┛
================================================
第2章 ActionScript 3 語言基本元素
================================================
2.1.2 數據類型概述
簡單數據類型
Boolean(布爾)、int(有符整型)、Number(浮點)、String(字符串)、uint(無符整型)
復雜數據類型
Array(數組)、Date(日期)、Error(異常)、Function(函數)、RegExp(正則表達)、XML、XMLList
2.2.1 變量聲明
var 變量:類型
var 變量:類型 = 值;
2.3 聲明常量
const 常量名:類型 = 值;
2.4 基礎數據類型
1.布爾值 Boolean(初始化為false)
2.數字:int uint Number
int? 有符號32位整數 -2(31次方) -? +(2(31次方)-1)
uint 無符號32位整數 0 -? 2(32次方)-1
Number 64位浮點
能用整數優先用int uint,有正負之分,用int。只處理整數,用uint,有小數,用Number。
2.4.6 Object及關聯數組
var 對象:Object = new Object()
var 對象:Object = {};
2.4.8
Null、NaN、undefined及各自應用對象:變量的默認值
數據類型??????? 默認值
int???????????? 0
uint??????????? 0
Number????????? NaN
String????????? null
Boolean???????? false
Array?????????? null
Object????????? null
沒聲明????????? undefined
*?????????????? undefined
注意:必須聲明初值,否則容易出錯。
2.5 運算符,表達式及運用
2.5.11 typeof、is、as
typeof,用字符串返回對象類型,格式: typeof(對象)
is??? ,判斷操作符左邊的對象是否屬于右邊的類型,返回值為Boolean,格式:? 對象 is 數據類型
as??? ,判斷操作符左邊的對象是否屬于右邊的類型,屬于則返回數據,不屬于則返回null,格式: 對象 as 數據類型
typeof對象類型與返回結果對照表
對象類型??????????????? 返回結果
Array?????????????????? object
Boolean???????????????? boolean
Function??????????????? function
int???????????????????? number
Number????????????????? number
Object????????????????? object
String????????????????? string
uint??????????????????? number
XML???????????????????? xml
XMLList???????????????? xml
2.5.12 in
in??? ,判斷操作符左邊的對象是否作為右邊對象中的鍵(Key)或索引,返回值為Boolean
比如:
var a:Array = ["q","w","e"];
trace(2 in a);? //數組中有索引2,返回true
trace(3 in a);? //數組中沒有索引3,返回false
2.5.13 delete關鍵字
AS2.0中可以刪除任意任意對象的delete關鍵字,在AS3.0中只能用于刪除對象的動態實例屬性,非動態屬性不能刪除。
如果要將一個對象刪除,使用 對象名 = null 來進行賦值操作即可。
================================================
第3章 ActionScript 3 流程控制
================================================
3.4.5 for...in和for each...in
for(var 枚舉變量 in 枚舉集合)? //枚舉變量返回為集合元素鍵名
for each(var 枚舉變量 in 枚舉集合)? //枚舉變量返回為集合元素值
3.4.7 break和continue標簽的特殊用法
在循環語句前用? 標簽:? 的形式為循環體賦標簽,然后就可以在break和continue語句后 加上空格+這個標簽,實現控制對應循環的功能。
3.5 AS3.0中switch比較默認使用 === 全等比較,switch條件不會自動執行類型轉換,要注意。
================================================
第4章 ActionScript 3 中的函數及高級使用技巧
================================================
4.1.1 兩種定義函數的方法
函數定義式????? -?????? 函數變量式
函數語句定義法? -?????? 函數表達式定義法
函數定義式 用function開頭,function 函數名(){}
函數變量式 用 var 變量名 = function(){} ,即匿名函數
AS編譯器會優先執行定義式的函數,而變量式函數則只能先定義,后使用(與變量一樣,先定義,后使用)
變量式中this關鍵字綁定對象 定義式中this關鍵字只綁定場景
var num:int = 3;
function testThisA(){
??????? trace(this.num)
??????? //此處輸出3
}
var testThisB:Function = function(){
??????? trace(this.num)
??????? //此處輸出300
}
var Obj:Object = {num:300};
Obj.TestA = testThisA
Obj.TestB = testThisB
4.2 參數
4.2.1 按引用傳入參數
AS3.0中,所有形參均為引用傳入方式,只不過,基元數據是不變對象,所以與傳值方式效果一樣。
4.2.2 函數默認參數
function 函數名(形參:類型 = 默認值)
4.2.3 形式參數數組
函數中默認自動生成的arguments對象中保存有所有定義中的形參參數
AS2.0中的arguments數組形參對象,存放所有傳入的不定個數的形參參數。
而在AS3.0中,argument則被嚴格限定存放形參定義中所定義個數的形參。
arguments對象有一個length屬性和一個callee方法。
function 函數名(形參:數據類型,形參:數據類型){
??????? trace(arguments.length)
??????? arguments.callee
??????? //調用函數本體,一般用于創建遞歸
}
如果需要傳入任意多個參數,則使用AS3.0中的rest關鍵字,即 ...
特殊關鍵字 ...(rest)
function 函數名(...參數名){
??????? //參數名可隨意定義
??????? trace(參數名.length)
}
最后要注意的,arguments與...rest關鍵字不能混用,使用了...rest則arguments則不能再使用
┏━━━━━━━━━━━━━━━━━━━━┓
┃ 第二部分:ActionScript 3 面向對象編程 ┃
┗━━━━━━━━━━━━━━━━━━━━┛
================================================
第5章 類和對象 ━━ 從定義到原理
================================================
5.1 基本類結構
基本結構:HelloWorld
package
{
public class Hello
{
??????? public var helloString:String = 'World';
??????? public function Hello(){
??????? }
??????? public function sayHello():void{
??????????????? trace("Hello");
??????? }
}
}
ActionScript3中的類如果想被外部訪問,必須放在package(包)中
構造函數與類名相同,為與其它類內函數區分,一般首字母大寫。
5.2 Class(類)和Object(對象)
類是對象結構的描述。
5.3 Class的成員
ActionScript3中的Class(類)的構成
·Class的名稱和包路徑
·構造函數
·屬性:包括實例屬性和表態靜態屬性
·方法:包括實例方法和靜態方法
AS3中對類的默認訪問控制是internal(包內可見),而非AS2.0中的public
5.4 Class和object的創建和使用
5.4.1 創建Class
參看5.1 基本類結構
5.4.2 創建類的實例
import 包路徑.類名
///相同包下,不用import類名,可直接引用
var 對象 = new 類()
var 對象:類 = new 類() //推薦
new 關鍵字后跟的其實不是類名,而是類的構造函數
5.5 Class和package(包)
package格式:
package 項目根.包路徑
比如:
package com.kinda.book.display
類名統一用大寫字母開頭,包路徑統一用小寫
類體結構安排:
package [包名]{
??????? import 類包;
??????? public class 類
??????? {
??????????????? //private 靜態屬性
??????????????? //private 靜態方法
??????????????? //private 實例屬性
??????????????? //構造函數
??????????????? //實例方法
??????????????? //靜屬 靜方 實屬 構函 實方,聲明類內數據的五個順序
??????????????? public function 構造函數(){
??????????????????????? //函數代碼??????
??????????????? }
??????? }
}
5.6 實例屬性和實例方法
實例屬性和實例方法類似于動態網頁語言中的session,不同的類實例(對象)中的實例屬性可以有不同值 。
5.6.1 實例屬性
訪問控制符 var 屬性名:數據類型;
訪問控制符 var 屬性名:數據類型 = 值;
訪問控制符可以是 internal public private protect 或者自定義的namespace標識
默認為internal - 包內成員可以訪問,包外不可訪問
5.6.2 實例方法
訪問控制符 function 方法名(形參):返回值類型{
??????? //方法內容?
}
5.6.3 訪問實例屬性和實例方法
使用new 語法實例化對象后,
對象.屬性|方法名
5.7 靜態屬性和靜態方法
靜態屬性和靜態方法類似于動態網頁語言中的Application,不同的類實例(對象)間共享類中共同的屬性和方法。
聲明靜態屬性:
static var 屬性:數據類型;
static var 屬性:數據類型 = 值;
public static var 屬性:數據類型;
public static var 屬性:數據類型 = 值;
不加訪問控制符時,默認同樣是internal
如果要聲明靜態常量,需要配合使用 static 和 const
static const 屬性:數據類型 = 值;
靜態方法:
同樣是使用static關鍵字
訪問控制符 static function 方法名(形參):返回值類型{
??????? //方法內容
}
5.7.3 訪問靜態屬性和靜態方法
類名.屬性
類名.方法
例:
Math.floor
Math.PI
為了避免與類內成員變量沖突,訪問靜態屬性及方法時,即使在類體內訪問也最好用 類名.屬性 這樣的格式來寫
5.7.4 應用1:使用靜態屬性集中管理數據
public static const PI:Number = 3.141592653589793;
比如事件定義,一般都是使用靜態屬性的,那我們使用中文來定義屬性,就可以在代碼中使用中文事件了
比如:
public static const 播放:String = "play";
使用事件時就可以用 對象.播放 來實現代碼的中文化了
5.7.5 應用2:使用靜態屬性部分實現Enumeration(枚舉) [略]
5.7.6 應用3:實現工具類
如:Math String等類
5.8 構造函數
定義:構造函數用于創建對象時供系統自動調用的函數,實現數據的初始化操作
格式:
public 類名(形參){
??????? //構造函數名與類名相同,首字母大寫,以與其它函數等區分
??????? //形參中同樣可以使用...rest運算符載入不同個數的參數,實現類似重載的功能
}
5.8.3 構造函數的返回類型
構造函數只能返回undefined值,所以return沒意義。
但return可以影響構造函數向下執行代碼的順序,遇到return時,其下的代碼將終止執行。
5.9 Clas的種類:動態類和密封類
密封類在運行時不能動態添加屬性或方法。
動態類在運行時可以動態添加屬性或方法。
默認聲明的類為靜態類,動態類在class關鍵字前有 dynamic 關鍵字
注意:AS3.0中的 for...in循環, for each...in循環只能遍歷動態類對象的動態屬性
5.10 this關鍵字 [略]
5.11 ActionScript3中的方法重載
public 類名(...rest){
??????? //根據傳入的函數個數進行處理
??????? //不支持不同類型參數的區分作為重載的標準
}
5.12 含有多個類的ActionScript3 類文件的標準例子
(1)每個AS3的Class都必須寫個一個和類同句的.as文件中
(2)package包體括號內只能定義一個Class
(3)在package包體中定義的Class,必須與類文件名相同
(4)在package包體括號外還可以定義其它類,這種類,叫包外類,只能被當前as文件中的成員類訪問
========================================================
第6章 ActionScript3中的封裝:類的成員、類、包與訪問控制
========================================================
公認OOP的三大要素為:封裝、繼承、多態
6.1 什么是封裝 [概括]
封裝(encapsulation),又叫隱藏實現(hiding the implementation),具體的意思是將實現的細節隱藏起來,只將必要的功能接口對外公開。打個比喻就是汽車,用戶只需要知道踏油門就會加油,打 方向盤就會轉向,至于汽車內部的實現細節,用戶不用知道,而這些細節,就是屬于封裝了。
在ActionScript3.0中,使用 訪問控制說明符 來控制代碼的可見度。
訪問控制說明符從“毫無限制”到“嚴格限制”的順序是:
public????????? 完全公開
protected?????? 在private的基礎上,允許子類訪問
internal??????? 包內可見
private???????? 類內可見
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ???????????????????????????????? 引用原話:??????????????????????????????????? ┃
┃??????????????????????????????????????????????????????????????????????????????? ┃
┃???? 一個好的OOP程序,就像人開汽車那樣,對象和對象之間的交流只限于公開的接口。? ┃
┃? 好的OOP程序,沒有流程執行先后的概念,只有代碼單元之間如何相互交流和協同工作?? ┃
┃? 的模式。這些代碼單元,又被稱為模塊。模塊在代碼中的表現形式是一個單獨的類或??? ┃
┃? 多個類。這些類共同協作,提供一種或多種服務。??? 那么如何讓一部分接口暴露呢?? ┃
┃? 如何隱藏不對外公開的方法呢?使用訪問控制說明符,這是實現封裝的一個重要方法。? ┃
┃? ActionScript3使用訪問控制說明符來告知外部使用者,本代碼單元有哪些成員可以被?? ┃
┃? 外部訪問到,哪些不能被訪問到。將訪問控制符從“毫無限制”到“嚴格限制”??????? ┃
┃? 排一下序:public、protected、internal和private。這些訪問控制符,清楚明白地??? ┃
┃? 描述了每個部分的訪問權限。一個優秀的OOP程序,會盡可能將單個代碼單元的細節隱?? ┃
┃? 藏起來。換句話說,就是盡可能不要對外公開代碼單元的成員。順便說一句,不少OOP?? ┃
┃? 程序員最喜愛private關鍵字,因為這意味著最大的修改自由。很有意思,在OOP編程中,┃
┃? 你對代碼單元訪問控制得越嚴格,日后你對代碼修改的自由越大。??????????????????? ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
6.2 為什么需要封裝
6.2.1 封裝使修改代碼更加容易和安全
封裝使程序員在后期修改代碼或在應用第三方代碼的時候,可以在前期嚴格的訪問控制定義下,令到改代碼的時候,可以有的放矢地改,而不用擔心因為改變部分代碼而有可能令到程序的其它部分產生其它新問題.
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ???????????????????????? 引用原話:??????????????????????????????????????????? ┃
┃??????????????????????????????????????????????????????????????????????????????? ┃
┃??? 封裝使修改代碼更加容易和安全.開發RIA軟件,和所有其它語言開發軟件一樣,????? ┃
┃會經常調度和修改代碼.一般說來,軟件的修改和調度時間可能會與開發時間相等,?????? ┃
┃甚至更長.因此,程序開發者所寫的代碼要經得起不斷的修改.尤其是當編寫的代碼要????? ┃
┃提供給第三方使用時,更要小心你所做的修改,確保你的修改不會危害其它代碼的穩健性. ┃
┃??????????????????????????????????????????????????????????????????????????????? ┃
┃??? 如何確保穩定性?每個類有那么多的屬性、方法,你如何知道其它程序員使用了哪些?? ┃
┃成員不知道就無從修改!如果有個標識,標識哪些是第三方可以訪問的,哪些是他們不能? ┃
┃訪問和修改的就好了。??????????????????????????????????????????????????????????? ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
6.2.2 封裝讓代碼分成一個個相對獨立的單元
只要保持對外的接口不變,那么內部的代碼結構可以任意改動,保證了代碼單元的修改和替換更加安全,軟件維護和修改都能有的放矢。
6.2.3 封裝讓整個軟件開發的復雜度大大降低
模塊化,降低復雜度才是封裝這個思想產生的最真實的原因,代碼易于修改、替換、復用等只是這一點附帶的好處而已。
6.3 ActionScript3中封裝的幾個層次
包外 ->? 包 -> 類 -> 包外類? (由外層到內層的結構,越靠近內近,訪問權限越嚴格)
包外:相當于公共權限,任意第三方都可以訪問到其中的代碼單元。
包(package):包內的成員互相可以訪問,但包內的成員不能被包外的成員訪問到。
類(class):一個包中可以包含很多個類,在類的內部,類的成員可以相互訪問,但外部是沒有辦法訪問到類的私有成員的。
包外類:這是最底層的類,在package語句外定義,只能被當前類中的成員訪問,類似只能被當前類調用的私有函數。
6.4 package(包)
package用于劃分訪問控制和實現模塊化功能。
6.4.1 包的導入(import)
使用任何一個類之前,必須先導入這個類所在的包,即使使用 全飾路徑,也必須先導入包。
在Flash CS3文檔時間軸上寫代碼時,flash.*默認是自動導入的,可不用手動import
1.導入單個類
import 包路徑;
2.使用通配符導入整個包
使用*號可以快速導入指定包的所有類,但一般為了程序的清晰,建議少用,而是直接寫清楚導入類的包名
import 包路徑.*;
3.使用同一個包內的類文件無須導入
如果導入的不同包中有同名的類,則需要在聲明使用時使用全飾路徑,即:new 完整包路徑.類名();
6.4.3 package的創建和命名
業界習慣是使用域名來定義包路徑
比如 com.kinda.book.display
如果沒有,也可以使用自己的電子郵箱
比如? com.21cn.kinda.book.display
在項目工程目錄下 建立 com文件夾,在com文件夾建kinda文件夾,在kinda文件夾內建book文件夾
使用系統目錄形式來實現包的管理
創建包的過程:
1.選好包名,一般以域名段倒寫為前綴;
2.在硬盤上根據定好的包名結構創建對應的目錄結構
3.在包中創建的任何類,頭部package定義中必須寫上包路徑
修改包結構的時候有三點要做:
1.移動包目錄
2.修改包中類頭部 package中的包名
3.修改相應import類中的包名
6.5.1 類路徑
Ctrl+U > ActionScript > ActionScript 3 Settings...
在此可添加系統類包路徑,供全局調用。
6.6 類成員的訪問控制
AS3中有四種訪問控制符:
public
private
internal
protected
訪問控制符不僅控制實例屬性和方法,對靜態屬性和方法也有同樣的作用。
6.6.1 internal:包內訪問
AS3中所有類成員在沒加訪問控制符的情況下,都為默認的internal權限,
可以被同一個包內的其它類成員訪問
6.6.2 public:完全公開
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ?????????????????????????????? 引用原話:??????????????????????????????????????? ┃
┃????????????????????????????????????????????????????????????????????????????????? ┃
┃??? 在些要提醒的是,public的類成員應當看成是這個類對外部做出的承諾、協議,??????? ┃
┃一旦決定,日后不能輕易改動。不能僅僅為了其他類可以訪問某個成員,而輕率地將該成員設┃
┃為public。這是OOP新手極容易犯的錯誤。???????????????????????????????????????????? ┃
┃??? 一旦發現某個類成員需要頻繁被外部訪問,就要先考慮這個類成員的設計是否不當,??? ┃
┃可否獨立出來;再考慮可否歸入那些需要頻繁訪問的包中,使用internal級別來實現;最后再┃
┃考慮使用public的訪問控制。??????????????????????????????????????????????????????? ┃
┃????? 總之,盡量將類成員的訪問權限控制到最低限度,這才能給日后的修改、維護代碼帶來┃
┃最大的自由。????????????????????????????????????????????????????????????????????? ┃
┃????????????????????????????????????????????????????????????????????????????????? ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
6.6.3 private:僅當前類可訪問
private修飾的類的成員,稱為私有成員(private member),除了類體內可以訪問外,包內的其它類和繼承的子類等都不能訪問私有成員。
對于復雜數據類型(比如數組等)的屬性來說,private只能限制通過當前類的實例來訪問,但不能限制這個屬性所指向的引用對象本身的訪問。
6.6.4 protected:子類可訪問
protected修飾的對象只能被當前類和當前類的子類對象訪問,等同在private基礎上增加對子類的支持。
protected修飾的子類不受包的限制,可以在不同類中,如果不是當前類子類,那和private是一樣的。
6.7 getter和setter方法
getter和setter方法是存取器方法
getter方法:
訪問控制符 function get 訪問屬性名():返回類型{
??????? 其它代碼
??????? return 要訪問的私有屬性;
}
setter方法:
訪問控制符 function get 訪問屬性名():返回類型{
??????? 其它代碼
??????? 要訪問的私有屬性 = 參數;
}
概括:封裝的意義就是不想用戶直接訪問類內的數據,而使用getter和setter則是一種折衷的辦法,當用戶需要設置對象屬性的時候,通過setter函數對傳入數據進行驗證,然后再賦值給對象,確保了數據的完整性。
另外一個,當設置了setter和getter時,屬性為可寫可讀,當只設置setter時為只寫(一般較少見),當只設置getter時,屬性為只讀,通過setter和getter來達到控制訪問的目的。
6.8 類(Class)的訪問控制
internal(包內可見)和public(包外可見)兩種
6.9 包外類
包外類是類的私有單元,在package代碼體外定義。
調用時,如果包中有同名類,則優先調用包外類。
========================================================
第7章 命名空間
========================================================
========================================================
第8章 復合與繼承
========================================================
復合和繼續的核心思想是重用現有的代碼。
┏━━━━━━━━━━━━━━━━━━┓
┃ 第三部分:ActionScript 3 核心類?? ┃
┗━━━━━━━━━━━━━━━━━━┛
================================================
第11章 ActionScript 3 核心類和全局函數
================================================
11.1 ActionScript3 中核心類和函數的變化及原因
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ ??????????????????????????????????????? 引用原話:???????????????????????????????????????????????????? ┃
┃??????????????????????????????????????????????????????????????????????????????????????????????????????? ┃
┃?? 核心類和全局函數是什么?簡單地說,就是處于頂級包中的類和函數。從代碼編寫上說,我們可以在任何地方直?? ┃
┃接調用它們,而不需要導入包或寫全飾名稱。從功能上說,它們是一門編程語言中最基礎的類和函數,也是最常用到? ┃
┃的功能;從包路徑上說,它們處于頂層,在頂級包 (Top-Level Package)中。????????????????????????????????? ┃
┃??????????????????????????????????????????????????????????????????????????????????????????????????????? ┃
┃??? 在ActionScript3中,頂級包已經發生了很大的變動。ActionScript2中我們熟悉的很多全局函數和類,在??????? ┃
┃ActionScript3中都不再是頂級包中的成員了。比如,getTimer()、setInterval()函數就不再是全局函數,而??????? ┃
┃MovieClip類、Sound類也已經不再是頂級類。在ActionScript3中,在使用它們之前,必須使用import導入它們所在?? ┃
┃的包。????????????????????????????????????????????????????????????????????????????????????????????????? ┃
┃?? ActionScript3的核心類有多少?ActionScript2中可以全局訪問的類有40多個,全局函數(包括未公開的)有70?? ┃
┃個左右;相比之下,ActionScript3處于頂級的核心類只有28個,全局函數僅21個,另加全局常量4個。????????????? ┃
┃?? 那么為什么會發生這么大的變化呢????????????????????????????????????????????????????????????????????? ┃
┃??????????????????????????????????????????????????????????????????????????????????????????????????????? ┃???? ┃??????????????????????????????????????????????????????????????????????????????????????????????????????? ┃???? ┃??????????????????????????????????????????????????????????????????????????????????????????????????????? ┃
┃ActionScript 3 中核心類和函數的變化及原因?????????????????????????????????????????????????????????????? ┃
┃??????????????????????????????????????????????????????????????????????????????????????????????????????? ┃
┃??? 和ActionScript2 中混亂的核心類和全局函數進行比較,就可以明白ActionScript3中不得不進行變革的原因。?? ┃
┃?? ActionScript2擁有過多的核心類和全局函數,是非?;靵y和不成熟的。先說說ActionScript2中類的架構:屬于?? ┃
┃顯示對象的MovieClip、Video、TextField、Button,屬于網絡API方面的LoadVars、NetConnection、NetStream,屬? ┃
┃于繪圖方面的一些類,等等,還有一些其他雜七雜八的類都被放在頂級包中。再看看整個系統架構,這些頂級類和相? ┃
┃當一部分非頂級類都是直接繼承自根類Object類的。在ActionScript2中,頂級包和flash.*包中總共才69個類,居然? ┃
┃有近三分之一直接放在了頂級包中,近三分之二直接繼承根類Object。這樣的系統架構是極不優雅的,不利于語言的? ┃
┃進一步完善。??????????????????????????????????????????????????????????????????????????????????????????? ┃
┃?? 再看全局函數中的不合理之處:getURL()、setInterval()、gotoAndStop()等不應該成為全局函數,而應當分別?? ┃
┃歸類在網絡、工具、視覺元件這樣的包中,并劃分給特定的類才對。除此而外,還有很多為了和低版本的Flash兼容?? ┃
┃而保留的一大堆過時的函數,比如setProperty()等。???????????????????????????????????????????????????????? ┃
┃??????????????????????????????????????????????????????????????????????????????????????????????????????? ┃
┃??? 我們不是苛求前人,說他們的架構設計如何如何糟糕,應當怎樣怎樣,而是與之比較,明白進步之處,從而對現? ┃
┃有架構有更深的理解和領悟。可以看出,這樣混亂的狀況已經不能適應語言發展要求的標準,只能推翻它,重新設計? ┃
┃一個科學而優雅的架構。這就是ActionScript3誕生的原因和目標。一旦開始系統架構設計,首當其沖的就是頂級包?? ┃
┃中的成員安排。????????????????????????????????????????????????????????????????????????????????????????? ┃
┃??? 由于宣布了不與ActionScript2及1兼容,沒有了歷史包袱,一大堆的過時函數全部淘汰,不合理的頂級類(核心? ┃
┃類)和全局函數都重新進行了劃分。一些不合理的全局函數分別放到相應的包(package)中,比如getURL(),就被?? ┃
┃ActionScript3中的flash.net包的navigageToURL()替代了;setInterval()函數被放置到了flash.util包中。而不應? ┃
┃放在頂級的一些原核心類在重新調整,也被放到了其它的包中????????????????????????????????????????????????? ┃
┃??????????????????????????????????????????????????????????????????????????????????????????????????????? ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
11.2 核心類的數目和列表
核心類:(28個,7類)
根類:Object
語言結構:Class(類)、Function(函數)、Namespace(命名空間)、arguments(參數數組)
基本類型:int(有符整形)、Boolean(布爾)、Number(浮點)、String(字符)、uint(無符整型)
常用復雜類型:Array(數組)、Date(日期)、RegExp(正則)
XML相關類:XML()、XMLList()、Qname()
異常類:Error(異常)共11個異常類
工具類:Math(數學)
全局函數:(6類)
類型轉換函數:Array,Boolean,int,Number,Object,String,uint,XML,XMLList
URI編碼解碼:decodeURI,decodeURICompnent,encodeURI,URIencodeURIComponent
URL編碼解碼:escape,unescape
判值函數:isFinite,isNaN,isXMLName
字符串轉值函數:parseFloat,parseInt
控制臺輸出函數:trace
================================================
第12章 數組:Array
================================================
12.1 數組(Array)的介紹
ActionScript3中的數組(Array)是以非零整數為索引的稀疏數組(sparse array).所謂稀疏就是指數組元素可以是不同數據類型,不支持類型化數組(typed array).
12.1.1 訪問數組元素
數組索引從0開始
12.1.2 數組的長度
ActionScript3的數組是可變長度數組,可以使用數組的length屬性訪問數組長度
1.使用length屬性可以返回數組長度
2.向length屬性賦值,將改變數組的長度,超出當前元素的部分會使用空值作填充
3.向超出數組length值的索引賦值時,數組會自動增加長度,中間部分會用空值作填充
4.向length屬性賦值時,如果低于當前length值,則減少的數組索引將被自動刪除
12.2 數組(Array)的基本操作
增、刪、查、改、排序
12.2.1 查找:indexOf、lastIndexOf
查找元素,找到就返回索引位置,如果找不到,返回-1
indexOf 從左到右
lastIndexOf 從右到左
indexOf/lastIndexOf(查找元素[,查找起始位置])
查找時使用的是 === 全等于條件,不作數據類型自動轉換,所以 "123"與123是不同的
12.2.2 在數組首尾新增元素:push、unshift
push,在數組尾部增加元素
unshift,在數組頭部增加元素
push/unshift[元素1[,元素2,...元素n]]:uint
返回值:添加元素后數組的長度
12.2.3 刪除數組首尾元素:pop、shift
pop,刪除數組最后一個元素
shift,刪除數組第一個元素
這兩個函數均無參數
返回值:所刪除的元素
12.2.4 在數組當中插入或者刪除元素:靈活多變的splice
數組.splice(刪除起始索引[,刪除數量,插入元素1,插入元素2,...插入元素n])
1.從指定索引開始,刪除指定數量的元素,并在原位置上插入新元素
數組.splice(刪除起始索引,刪除數量,插入元素1,插入元素2,...插入元素n)
刪除起始索引可以為負數,即從結尾倒數第負數個元素開始向后刪除,-1則為倒數第一個元素
2.刪除指定起始點后的指定數量元素
數組.splice(刪除起始索引,刪除數量)
3.刪除指定起始點后的所有元素
數組.splice(刪除起始索引)
4.在數組某索引位后,插入元素
數組.splice(刪除起始索引,0,插入元素1,插入元素2,...插入元素n)
返回值:被刪除的元素
注意:splice會改變所操作的數組對象,如果只是想得到數組一段內容,請使用slice
12.2.5 獲取數組中的部分元素:slice
數組.slice([獲取起始索引,獲取終止索引]):Array
起始和終止索引都可以使用負數
返回值:
1.查找到元素組成的新數組,數組元素包含起點索引元素,但不包括終止索引元素(即前一個)
2.只有獲取起始索引時,返回從起始索引處到結尾所有元素的數組
3.不提供參數時,將生成原數組的一個淺復制
注意:當起始索引大于終止索引時,函數會函數一個空值,負數索引時特別容易出錯
12.2.6 將多個元素或數組拼合成新的數組:concat
數組.slice([元素1,元素2,...元素n]):Array
與push一樣,是在數組尾部追加數據
不同的是
1.push影響原始數組,concat不影響原始數組,而是返回一個新結果的數組對象
2.當追加的對象是數組時,push會直接添加,而concat會按元素順序逐個加入到新數組中
3.不提供參數時,將生成原數組的一個淺復制
返回值:結果數組
12.2.7 數組的淺復制與深復制
淺復制就是說只是復制引用,操作對應對象時還會影響引用的對象。
一般調用數組的slice或concat函數時,不傳入參數,都可以生成淺復制對象
深復制不是生成復制對象的一個副本,所有對返回對象的操作,都不會影響到原始對象,是完全復制。
深復制使用ByteArray類
var BA對象:ByteArray = new ByteArray();
BA對象.writeObject(源對象);
BA對象.position = 0;
var 備份對象:Array = BA對象.readObject() as Array;
12.2.8 排序:reverse、sort、sortOn(均會影響源數組)
數組.reverse():Array
reverse將數組倒序排序
返回值:排序后的新數組
sort([排序方式|比較函數]):Array
1.不提供參數時,將按默認的ascii排序規則排序
2.傳入排序方式:排序方式其實就是Array類內置的一組常量
Array.CASEINSENSITIVE???? 值為1 ,大小寫不敏感順序排序,數字按從小到大
Array.DESCENDING????????? 值為2 ,按字母倒序
Array.UNIQUESORT????????? 值為4 ,必須唯一性排序,如果排序元素中有重復,結果將返回0(即放棄排序)
Array.RETURNINDEXEDARRAY? 值為8 ,sort或sortOn函數排序后返回排序后的索引列表,保持原數組不變
Array.NUMERIC???????????? 值為16,強制sort和sortOn函數對數值采用從小到大排序,按數值排序時必須用此
排序方式可以用 | 分隔開作為一組參數傳入sort或sortOn,也可以將對應值相加直接傳入
3.比較函數
function 函數名(參數A:類型, 參數B:類型):int{
}
排序時,會自動匹配所有兩個參數進行比較,
當返回值為1時,參數A對應元素排到參數B對應元素后
當返回值為0時,參數A與參數B位置保持不變
當返回值為-1時,參數B對應元素排到參數A對應元素前
sortOn("name"[,排序方式|比較函數]):Array
sortOn用于對復雜型數據數組進行排序
[詳細請看書p211,此節筆記無法清晰記錄]
12.3 操作數組每個元素:forEach、every、filter、map、some
(本節筆記略) p214
================================================
第13章 字符串:String
================================================
13.2.1 運用charAt()和charCodeAt()??? 取字/取字Unicode碼
字符對象.charAt(索引)
獲取索引指定處的字符,索引從0開始
字符對象.charCodeAt(索引)
獲取索引指定處的字符的Unicode整型值。
13.2.2 運用formCharCode()???????????? 根據Unicode碼返回字符
formCharCode:根據傳入的數值返回對應字符
這是String類的靜態屬性
String.formCharCode(Unicode碼[,Unicode碼])
多個Unicode碼可用逗號分隔
例如:
String.formCharCode(27583,22530,20043,36335O); //返回 殿堂之路 四個字
String.formCharCode(0x41,0x53,0x33); //返回 AS3 ,這里用了16進制值
13.6 常用的字符串操作
13.6.1 indexOf()的使用及search()的區別?????????? 查找字符
字符對象.indexOf(查詢對象[,搜索起始索引])
如果沒找到結果,則返回-1
13.6.2 substring()、slice()和substr()的使用及區別??? 查找并獲取字符
三者的共同點都是不會影響源操作字符串
字符對象.substring(起點位置[,終點位置])
字符對象.slice(起點位置[,終點位置])
字符對象.substr(起點位置,截取長度)
substring:
1.起始點和終點不能為負數,否則會被當成0處理。
2.如果起始點索引大于終點索引,執行時索引位置會互換。
3.如果只填寫起始索引,則結束索引默認為最后一個字符
slice:
1.起點索引和終點索引均支持負數索引,當索引為負時,代表從右向左數
2.如果起始點大于終止點,則返回一個空字符
3.如果只填寫起始索引,則結束索引默認為最后一個字符
substr:
參數支持正數和負數。
13.6.3 split()與正則表達式結合運用
字符對象.split(分隔符|正則表達式)???? 拆分字符為數組
支持強大的正則表達式
13.6.4 使用XML對象實現輸入不規則文本
var XML對象:XML =?
<標簽>
<![CDATA[
文本
]]>
</標簽>
XML對象.toString();
//通過XML對象的toString方法就可以得到完整代碼了
trace(XML對象.toString())
13.7 實用的mx.utils.StringUtil工具類
import mx.utils.StringUtil
StringUtil.trim(str:String):void 去除兩端空白
StringUtil.substitute(str:String,...rest):String 替換字符串
更多內容詳見書本p228
================================================
第14章 強大的正則表達式:RegExp
================================================
14.2.2 正則表達式的兩個構成部分
簡寫模式:
var 正則對象:RegExp = /匹配模式/標志位
構造函數模式:
var 正則對象:RegExp = new RegExp(匹配模式,標志位)
匹配模式就是正則表達式,標志位包括五個字母 gimsx
14.3 正則表達式語法
14.3.1 正則表達式中的文字符號
普通文字和符號:A-Z a-z 0-9 以及不是元字符的其它符號
輸入Unicode字符時,同String一樣,使用\uXXXX?
元字符:三三二三個一(記憶口訣)
三個括號:????? {[(
三個匹配次數:?? *+? 星加問
兩個斷言:?????? ^$ 定頭定尾
三個一:??????? | 選擇符 . 模糊匹配 \ 轉義
三個括號:
{定義匹配次數
[字符集
(子模式
三個匹配次數:
* 匹配出現0次或多次
+ 匹配出現至少1次或多次
? 匹配出現0次最多1次
兩個斷言:
^ 在/后出現時為左端斷言, /^
$ 在/前出現時為右端斷言, $/
三個獨立元字符:
| 選擇符,匹配時兼容匹配選擇符兩邊的字符
. 模糊匹配,可以代替
不可見字符:比較一些轉義的控制字符
14.3.2 正則表達式中的字符集
1.字符集的概念和最簡單的字符集形式
[字符集]
字符集用中括號括起來
Unicode字符請使用\uXXXX? 四位十六進制Unicode代碼輸入
如:/g[eo]t,分別匹配get和got,但不會匹配geot,因為字符集只能匹配一個字符
2.連字符在字符集中的運用
[字符-字符]
如:[a-z][A-Z],就是匹配英文字母字符集了
3.取反符號在字符集中的運用
[^字符集]
添加取反符號后,匹配時將忽略字符集中的所有元素
4.字符集中需要轉義的特殊字符
\轉義符號
常見要轉義的字符有三類:
1.字符串: 雙引號"? 單引號 ' 反斜杠 \
2.正則表達式的源字符
3.字符集中的: [\^-
盡可能將會產生歧義的字符轉義
14.3.3 特殊的點號(.)
.號可以替代任意單個字符,作為正則表達式中的模糊匹配字符
1.點號不匹配新行符(\n)
多行字符的模糊匹配中,.號不能匹配\n換行符,要匹配換行符,必須在標志位中使用s
2.盡量少使用點號“.”
只在明確不會模糊匹配時出錯的情況下才用.模糊匹配,點號匹配所有的Unicode字符。
14.3.4 選擇符
| 對選擇符兩邊的元素作任意匹配。
使用|選擇符時,盡可能使用括號將兩邊的操作數括起來,以方便區別。
14.3.5 括號與分組
() 圓括號將表達式的一部分括起來,就會將這部分定交成組,一旦命名了組,就可以通過“向后引用”來調用它。
它所括起的部分一般用于:
1.和選擇符搭配,規定作用于選擇符的范圍,如/he(got|get)it/
2.和限定符搭配使用,指定匹配的重復次數,如/(get)*/
14.3.6 用正則表達式描述字符串的重復
使用{}定義匹配的重復次數,跟在要重復的表達式或字符后面
{最小出現次數[,最多出現次數]}
還有常用的三個 非顯式限定符
*+? 星加問
*? 出現0次或多次??? 等同 {0,}
+? 出現1次或多次??? 等同 {1,}
?? 出現0次或最多1次 等同 {0,1}
14.3.7 注意正則表達式的貪婪性和懶惰性
使用*+?{}的時候,正則表達式總是盡可能向右搜尋盡可能多的匹配結果,如果想禁止此貪婪性,可在操作符后加上 ?,迫使程序運行時使用懶惰模式,優先使用左邊匹配的第一個結果。
14.3.8 用正則表達式來定位
斷言:指定匹配發生的位置
^?????? 匹配字符串起始的位置,一般跟在起始/后,組合成 /^
$?????? 匹配字符串結尾的位置,一般跟在結束/前,組合成$/
\b????? 匹配字符邊界
\B????? 匹配非字符邊界
字符邊界指空格的位置,可跟在要匹配的表達式左邊或右邊
14.3.9 正則表達式的5個標志位。
g?? global????? 全局匹配,盡可能匹配全部結果
i?? ignoreCase? 不區分大小寫匹配
m?? multiline?? 斷言控制符,使用后 ^$兩個斷言符才能生效
s?? dotall????? 匹配換行符標志
x?? extended??? 令正則表達式支持空格,但編譯時會自動忽略,增加可視的友好度
14.3.10 正則表達式元字符優先線
優先級順序從高到低排列
\?????????????????????? 轉義符
(),(?:),(?=),[]???????? 分級定義符號,字符集定義符號
*,+,?,{n},{n,},{n,m}??? 限定符
^,$,\位置定義?????????? 位置和順序
|?????????????????????? 選擇符
14.4 正則表達式與字符串的結合使用詳解
14.4.1 RegExp的exec()和test()
test方法
var RegExp對象:RegExp = /正則表達式/? 或? new RegExp(正則式,標志位)
var String對象:String = 字符;
RegExp對象.test(String對象)
RegExp對象.exec(正則表達式):Array
exec返回一個匹配后的數組
14.4.3 String類的replace()與正則表達式向后引用
()使用子表達式括起的表達式,可以在后邊引用 ,使用\n n為索引 從1至99
/\b([a-z]+) \1\b/gi? 其中的\1就是引用前面第一個([a-z])
此節部分略過 p245
14.5 常用的正則表達式
此節略 p246-p248
================================================
第15章 XML數據處理?
================================================
一大堆理論
15.4 創建XML對象
15.4.1 使用構造函數創建XML對象
var String對象:String = 字符串
var XML對象:XML = new XML(String對象);
trace(XML對象.屬性)
15.4.2 直接使用XML文本創建XML對象
var XML對象:XML = 直接輸入XML文本 或換行
或者使用變量的方式
var String對象:String = 字符;
var XML對象:XML =?
<{String對象}>
變量使用{}括起來,其它的與XML普通輸入無異
15.5 使用運算符操作XML數據
15.5.1 使用"."與"@" 直接訪問、修改、創建和刪除XML對象
訪問:
var XML對象:XML = XML文本;
trace(XML對象.節點名.子節點名)
trace(XML對象.節點[索引])
trace(XML對象.節點.@屬性)
trace(XML對象.節點.@屬性[索引])
15.5.2 使用"."與"@"直接修改XML對象
注意:如果存在多個同級元素時,不能直接使用.和@修改,因為返回結果是XMLList對象
XML對象.節點.子節點 = 值? //直接修改節點文本
XML對象.節點.@屬性 = 值? //直接修改屬性值
15.5.3 使用"."與"@"直接添加刪除子元素和屬性
注意:如果存在多個同級元素時,不能直接使用.和@修改,因為返回結果是XMLList對象
XML對象.節點.新節點名 = new XML(); //添加一個空白節點
XML對象.節點.新節點名 = 字符串;?? //添加一個字符串節點
XML對象.節點.@新屬性名 = 值;?? //添加一個節點屬性
刪除節點:
delete XML對象.節點.元素[@屬性]
15.5.4 簡單方便地搜索XML子元素和屬性
trace(XML對象.節點..子節點)? //顯示所有同級子節點
trace(XML對象.節點.@*.toXMLString()); //顯示所有同級節點中的所有屬性值
trace(XML對象.節點.(子節點 < 1000)); //顯示節點中所有節點文本大于1000的子節點元素
trace(XML對象.節點.(@屬性 == 值));? //顯示節點中屬性等于值的節點
15.5.5 使用正則表達式或自定義函數搜索XML子元素和屬性
自定義函數:
XML對象.節點.(自定義函數(子節點));
function 自定義函數(t:*):Boolean{
??????? t.length()
??????? if(t<100000) return true;
??????? teturn false;
??????? //自定義函數將根據子節點的數量執行多次
??????? //自定義函數返回值必須是Boolean
}
正則表達式:
XML對象.節點.(子節點.match(正則表達式));
15.6 用API實現的一些常用XML操作
本節略p264
15.7 XML的命名空間
本節略p265
15.8 XML對象與XMLlist對象
本節略p268
================================================
第16章 異常和錯誤的捕捉與處理
================================================
本章暫略 p269
┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 第四部分:ActionScript 3 主要的 Flash Player API? ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛
================================================
第17章 ActionScript3目前主要的API概覽
================================================
================================================
第18章 事件發送和處理
================================================
18.1 事件(Event)處理機制的產生和原理
為了減低數據交互相方的“耦合性”,ActionScript3給出了一個很好的解決方案——DOM3事件處理機制。
??? DOM3事件模型定義了一套標準的生成和處理事件消息的方法,使程序中的對象可以相互交互、通信,保持自身狀態和響應變化。通俗地說,數據的提供者只管發 出數據對象,只要確保數據對象是flash.events.Event類(或子類)的實例即可。這種數據對象,稱為事件(Event)。
數據對象的發出者,稱為事件發送者(Event dispatcher);
接受事件的對象,稱為事件偵聽者(Event listener)。
??? DOM3事件的優點在于,事件發送者和事件接收者的依賴性大大降低。事件發送者只需要發送事件對象,事件偵聽者只需要接受事件對象。事件接收者可以改變自 己的外部接口,只需要確保發送的事件對象不變即可。事件偵聽者也不必關心事件接收者是否變化,只需要保證自己能夠正確處理接收到的事件對象即可。
18.1.1 示意圖:點菜的例子
當客人進入一家飯店時,就等于告訴這家飯店的服務生,一會兒我們要點菜,你要過來服務。當點菜時,我們只要報上要點的菜,服務生自然會記下我們的要求,并吩咐廚房。
客人就是事件發送者(Event Dispatcher)
點菜就是客人發送的事件(Event)
服務生就是事件偵聽者(Event Listener)
而這個事件中,包含有3條主要內容:事件的類型、事件的目標、事件的相關數據。
事件類型(Type):點菜,服務生根據事件的不同,作出相應的操作,如果客人要求埋單,那么服務生就到柜臺取帳單。
事件目標(Target):事件發送者,如果服務生下單后就不記得是誰點的菜,就糟糕了。
事件數據(Data):事件所包含的其它信息,比如點菜就是菜的名字,而埋單,則是沒具體信息,只是讓服務生到柜臺取帳單。
18.1.2 DOM3事件的執行流程
DOM3事件機制包含4個步驟:
注冊偵聽器、發送事件、偵聽事件、移除偵聽器,按順序執行的。
注冊偵聽器(Add Event Listener):指定發出的事件由哪個對象接受處理,比如進入飯店時,就是注冊服務員為自己點菜事件的偵聽器,如果你在大街上直接發出點菜事件(大喊點菜),是沒人理你的(響應事件),客人就是服務生的偵聽對象。
只有在注冊偵聽器后,發送的事件才能被偵聽器接收到,而且發送的事件類型必須與偵聽器匹配,比如你叫在飯店中叫看電影,服務生就不清楚怎樣響應你了。
發送事件后,偵聽器才會處理事件,不可能你沒叫點菜之前,服務生就已經幫你到廚房下單了。
事件處理完成后,要移除偵聽器,不可能服務生在你有之前光顧的飯店的服務生都響應你的事件,去廚房點菜,這樣就不行了。
18.1.3 第一個事件處理代碼例子
詳閱p294
自己理解總結:
事件處理主要三個主體對象
1.事件發送者
2.事件類對象
3.事件偵聽者
事件發送者:要完成事件類對象的創建及初始化,再發送出事件
事件類對象:??? 聲明好事件名常量,及事件數據存儲變量,創建時調用父類構造函數
事件偵聽者:要創建響應事件處理的函數,供addEventListener調用?
文檔類:
構造事件發送對象
構造事件偵聽對象
事件發送對象.addEventListener(事件名常量,偵聽者處理函數)
事件發送對象.事件發送方法()
事件發送對象.removeEventListener(事件名常量,偵聽者處理函數)
18.2 ActionScript 3事件機制的新特色
18.2.1 回顧ActionScript 1 和 ActionScript 2中的事件機制
AS1中用戶最需要用 onClipEvent() on(),既方便又直接,但缺點是邏輯分散到各個舞臺元件和時間軸上,管理不便.
AS2開始,增加了一些事件處理機制:
回調函數:onLoad onComplete等,如常見的XML.onload事件
事件偵聽器:addListener() addEventListener
AS2.0的不足:
AS2中核心類和Flash API沒有內置事件,只有組件類(mx.*)才有內置事件,除了UIComponent能發送事件,其它類都不能發送事件.
AS2中,偵聽器的this關鍵字指向混亂,常常弄錯。偵聽器可以用對象object也可以用函數function。
AS2中,偵聽器注冊方式也有兩種,一種是addListener(),如Key;一種是addEventListener(),如UIComponent類。
18.2.2 ActionScript3 事件處理機制形式上的不同
注冊偵聽形式統一,使用事件偵聽統一使用addEventListener()
偵聽器統一使用function,不再允許Object當偵聽器
所發送的事件對象,必須是Event或其子類的實例
18.3 事件
p298 無法做筆記
18.4 偵聽器
略過~~~~~~~~~~~~
================================================
第19章 網絡通信基礎
================================================
19.1 ActionScript3網絡通信的流程
1.構建通信請求對象(URLRequest)
2.使用通信請求對象,構建URLLoader對象,并發出數據請求
3.數據收到之后,發出完成事件,調用“讀取完成“事件的偵聽器處理返回的數據
標準的加載方法:
var URL路徑:String = "URL地址";
var URLRequest對象:URLRequest = new URLRequest(URL路徑);
var URLLoader對象:URLLoader = new URLLoader(URLRequest對象);
提交的數據放在URLRequest對象中,讀取到的數據放在URLLoader對象中。
對于URL中的值對操作,要使用URLVariables類處理。
var 值串對象:URLVariables = new URLVariables("name=foo&age=28&sex=male");
var URLRequest對象:URLRequest = new URLRequest();
URLRequest對象.url = "動態網頁URL";
URLRequest對象.method = URLRequestMethod.GET; //數據格式
URLRequest對象.data = 值串對象;? //將URLVariables賦給data屬性
XML數據:
var XML對象:XML = XML文本
var URLRequest對象:URLRequest = new URLRequest();
URLRequest對象.url = "動態網頁URL";
URLRequest對象.contentType = "text/xml";
URLRequest對象.data = XML對象.toXMLString(); //將xml轉成文本賦給data屬性
URLRequest對象.method = URLRequestMethod.POST;
19.1.2 發出數據請求
發出數據請求,需要按照數據請求對象攜帶的信息,向指定地址發出請求,這部分由URLLoader對象來完成。
var URLLoader對象:URLLoader = new URLLoader(URLRequest對象);? //定義后立刻發送數據
var URLLoader對象:URLLoader = new URLLoader();?
URLLoader對象.load(URLRequest對象); //調用URLLoader對象的load后才發送數據
如果有數據返回,數據將放在URLLoader對象的data屬性中,dataFormat屬性則包含返回數據類型的值
dataFormat屬性支持三個常量值:
文本型(URLLoaderDataFormat.TEXT)
二進制(URLLoaderDataFormat.BINARY)
值串對(URLLoaderDataFormat.VARIABLES)
URLLoader對象有6種事件,可以讓我們偵聽:
load()一調用,就發出 Event.OPEN事件
加載過程中,會發出ProgressEvent.PROGRESS事件,包含下載字節數信息
加載完成,發出Event.COMPLETE
加載完成或者失敗之前,會發出HTTP狀態事件HTTPStatusEvent.HTTP_STATUS
加載失敗,發出IOErrorEvent.IO_ERROR
發現加載內容不合安全規則,發出SecurityErrorEvent.SECURITY_ERROR
19.1.3 偵聽器函數
使用標準的DOM3事件偵聽器函數即可,根據URLLoader對象的事件進行偵聽。
19.3 getURL()的繼承人:navigateToURL()
import flash.net.*?? //使用前要導入net包
navigateToURL(URLRequest對象:URLRequest[,window:String = null])
URLRequest對象 = 網址
window = 打開窗口的方法 _self _blank _parent _top
標準語法:
var URLRequest對象:URLRequest = new URLRequest(URL地址);
navigateToURL(URLRequest對象,"_blank");
或者
navigateToURL(new URLRequest(URL地址),"_blank");
19.4 提交數據的例子
單純提供數據,可以用sendToURL(),但一般極少這樣使用,而不返回數據。
public function sendToURL(request:URLRequest):void
19.5 簡述安全模型
Security.sandboxType 返回當前運行所處沙箱信息
目前Flash支持4種沙箱類型
Security.REMOTE???????????? SWF文件來自網絡,并遵守基于域的沙箱規則。
Security.LOCAL_WITH_FILE??? SWF文件來自本地,可以讀取本地數據,但無法訪問網絡通信
Security.LOCAL_WITH_NETWORK SWF文件來自網絡,可與網絡通信,但不能讀取本地數據
Security.LOCAL_TRUSTED????? SWF文件是本地文件,且已經受到用戶信任,此時既可與本地文件通信,也可以與網絡通信。
最后一種Security.LOCAL_TRUSTED權限最高,是在Flash IDE環境下測試是所擁有的權限。
19.5.2 跨域文件:crossdomain.xml
一個放置于網站根目錄的文件,用于允許被訪問的域。
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
<!-- *號定義全域允許 -->
<allow-domain-from domain="*.baidu.com" />
<!--只允許百度的域名訪問資源-->
</cross-domain-policy>
更多設置技巧:
http://livedocs.adobe.com/flash/9.0_cn/main/00000349.html
19.5.3
可臨時在swf內部設置允許訪問的域
Security.allowDomain()? 授權訪問域
Security.allowDomain(URL域)?
Security.allowDomain("*")?
Security.allowDomain("*.baidu.com")?
┏━━━━━━━━━━━━━━━━━━┓
┃ 第五部分:ActionScript 3 視覺編程 ┃
┗━━━━━━━━━━━━━━━━━━┛
================================================
第20章 ActionScript 3 視覺編程精要
================================================
20.1 什么是顯示對象
在舞臺上顯示的對象,在AS3中統一被稱為顯示對象(Display Object)
顯示對象除了包含能看得見的顯示對象外,也包括不能看見但卻真實存在的顯示對象容器(Display Object Container)
20.1.1 ActionScript3 中顯示對象等級結構
舞臺(Stage)
當前SWF(文檔類或MainTimeline)
容器
顯示對象
20.1.2 顯示列表:顯示對象模型
AS3中所有顯示對象歸使用顯示列表(Display List)的方式進行管理,只有在列表中列出的對象才會在舞臺上顯示。
顯示對象有兩種:在顯示列表中(on-list)和不在顯示列表中(off-list),在顯示列表中的對象會被渲染,不在顯示列表中的對象依然存在,不被渲染罷了。
20.2 ActionScript3中顯示對象的種類
20.1 ActionScript2中的MovieClip
MovieClip是萬能的,但缺點是一旦創建,就擁有了一大堆時間軸等屬性,非常浪費資源,有時候只將它作為空白容器。
MovieClip的地位在AS3中減弱了很多。
20.2.2 ActionScript3顯示對象種類劃分:一個統一、兩個層次
一個統一,AS3中所有顯示對象都統一于DisplayObject類
第一大層次:是否可以接受互動事件,可以接受的,稱為 可互動的顯示對象(InteractiveObject);
不可以交互的,稱為非互動顯示對象.
可互動的顯示對象(InteractiveObject):指能夠接受鼠標單擊、鍵盤敲擊等人機交互事件。
位圖、形狀、視頻等就不能接受這些事件,所以歸入不可以交互類。
第二大層次:是否可以作為容器,可以容納其它顯示對象的,稱為 顯示對象容器(Display Object Container)
20.3 顯示對象類庫架構
以下很好反映了? 一個統一、兩個層次? 這個概念
所有顯示對象都是繼承自父類DisplayObject這個抽象類,而父類DisplayObject則繼承自EventDispatcher類,
說明所有顯示對象都能發送事件。
DisplayObject、InteractiveObject、DisplayObjectContainer是顯示對象架構中的三個核心對象,
它們都是不能被實例化的抽象類
視覺架構類圖:
EventDispatcher(事件類)
?????????? ┃?
?????????? ┃?
根類 DisplayObject(抽象類,不允許實例化,只能實例化子類)
?????????? ┃?
?????????? ┃?
InteractiveObject(可以交互)━━━━━━?? (不可以交互)? ┏ Bitmap(位圖) - Shape(容器)
?????????? ┃?????????????????????????????????????????? ┣ Video(視頻) - AVM1Movie(AS1.0 2.0影片)????????????
┃?????????????????????????????????????????? ┗ [StaticText(靜態文本框)* - MorphShape(形狀補間)*]
?????????? ┃?????????????????????????????????????????????? 有*的為必須在舞臺上手動創建
?????????? ┃?
?????????? ┃?
DisplayObjectContainer(可以作為容器)? ━? (不可以作為容器) [SimpleButton(簡單按鈕) - TextField(文本框)]
?????????? ┃?
?????????? ┃?
?????????? ┃?
Sprite(簡單容器,簡化版MovieClip)?? ━━? Stage(舞臺) - Loader(加載)
?????????? ┃?
?????????? ┃?
?????????? ┣━━━━━━━━━━━━━ mx.core.FlexSprite - mx.core.UIComponent(Flex)
?????????? ┃?
?????????? ┃?
?????????? ┗━━ MovieClip(影片剪輯)
????????????????????? ┃?
????????????????????? ┃?
????????????????????? ┗━ mx.flash.UIMovieClip
20.3.1 InteractiveObject類和非InteractiveObject類
InteractiveObject類??? 可以接受人機交互事件
非InteractiveObject類? 不可以接受人機交互事件
不可以接受人機交互事件的類中有6個同級對象 :
AVM1Movie、Bitmap、MorphShape、Shape、StaticText、Video
其中再細分? MorphShape 和 StaticText不可以用代碼創建
StaticText是Flash編輯環境下用文本工具創建的
MorphShape是在flash中創建形狀漸變時自動生成的
AVM1Movie: Actionscript Virtual Machine1(ActionScript虛擬機1),即使用AS1.0 AS2.0創建的Flash影片,
為了向下兼容,當載入使用以上版本AS創建的影片時,會自動創建這個類,以同AVM2區分開來。
20.3.2 容器類和非容器類
第二層是InteractiveObject類的對象
包含三類,使用容器與非容器的概念來區分。
容器:可以在它里面加載其它的DisplayObject的容器
非容器對象:TextField、SimpleButton
TextField就是動態文本框
SimpleButton是Flash API
剩下的就是DisplayObjectContainer(顯示對象容器)類,其下有:
Sprite、Loader、Stage
Stage是舞臺類
Loader是原有MovieClip中加載外部資源的方法集合。
20.3.3 Sprite 和 MovieClip
Sprite將是我們在AS3中接觸最多的容器,可以把它理解成去掉時間軸的MovieClip。
Sprite中含有Graphic對象,可以像MovieClip那樣直接在自身繪圖,但Sprite不同于Shape,
區別在于Sprite是容器,而Shape不是。
MovieClip是Sprite的子類,只保留了一些與時間軸控制相關的gotoAndStop方法和currentFrame屬性等。
20.3.4 非Flash API的幾個顯示對象類
需要在Flex中使用到的顯示對象,必須是UIComponent類的子類或實現IUIComponent的接口(Interface)
20.4 ActionScript3 視覺架構的優越性
20.4.1 更高效的渲染,更好的內存利用
AS3中影片剪輯被弱化成
繪制矢量使用輕量的Shape對象,
需要容器使用輕量的Sprite對象,
降低了時間軸的使用,也同時降低了內存的浪費。
20.4.2 自動化的深度管理
AS3中的顯示對象深度由程序自動管理。
每個DisplayObjectContainer實例都有numChildren屬性,用于顯示對象容器中的子對象數目
顯示對象容器列表中對象的索引從0開始,到numChildren-1
20.4.3 完整遍歷顯示列表
在AS3中,可以訪問顯示列表中的所有對象,包括使用ActionScript創建的對象及在IDE中繪制的對象。
20.4.4 列表外的顯示對象
只有在顯示列表中的對象才會被顯示在舞臺上,添加到顯示列表的方法是調用addChild()或addChildAt()
================================================
第21章 DisplayObject類與矢量圖、位圖
================================================
21.1.1 顯示對象的可視屬性列表
AS3中所有原有對象的屬性前面的下劃線都去掉了,直接使用字母 ,比如 _x _y _alpha 之類變成x y alpha
注意的是:
scaleX scaleY alpha 之類原來0-100的值,在AS3中變成了0-1,其中的百分比使用小數
顯示對象基本有11個可視屬性(共有25個):
x、y、width、height、scaleX、scaleY、mouseX、mouseY、rotation、alpha、visible
21.1.2 顯示對象的其它屬性
顯示對象除了11個可視屬性外,還有5個常用屬性和9個不太常用的屬性。
除此之外,DisplayObject還擁有6個實例方法,能發出6種事件。
5個常用屬性:
name:?? 顯示對象名字,與AS2不同的是,創建對象時,name會自動分配
parent: 父容器,指向顯示列表的父容器,當顯示對象不在顯示列表中時,該屬性為null
root:?? 返回當前SWF主類的實例引用。
stage:? 舞臺
mask:?? 遮罩,指向用來遮罩的對象。
轉載于:https://www.cnblogs.com/tianlanliao/archive/2012/03/30/2425475.html
總結
- 上一篇: Web服務器的配置方法
- 下一篇: 人事薪资管理系统V1.00功能简介(适用