第1章 ActionScript教程 - 核心AS类
使用日期和时间
使用字符串
使用数组
处理错误
使用正则表达式
使用 XML
使用本机 JSON 功能
处理事件
使用应用程序域
1.1 日期和时间
日历日期时间及时间间隔,计时分别由Date类,flash.utile.Timer类来提供。
* 日期时间
//定义日期时间 var now:Date = new Date(); //无参数定义日期时间,为当前时间 var startTime:Date = new Date(1000*60*60*24); //1个参数毫秒数,自1970-1-1以来经过的毫秒数 var endTime:Date = new Date(2013,5,19,16,20,59,234); //参数为年、月、日、小时、分钟、秒和毫秒 //获取日期时间相应属性 /* • fullYear 属性 • month 属性,以数字格式表示,分别以 0 到 11 表示一月到十二月 • date 属性,表示月中某一天的日历数字,范围为 1 到 31 • day 属性,以数字格式表示一周中的某一天,其中 0 表示星期日 • hours 属性,范围为 0 到 23 • minutes 属性 • seconds 属性 • milliseconds 属性 */
日期值在内部以毫秒形式保存,日期时间的加减运算可以换算成毫秒再加减。
* 时间间隔
package { import flash.display.Sprite; import flash.events.TimerEvent; import flash.utils.Timer; public class ShortTimer extends Sprite { public function ShortTimer() { // creates a new five-second Timer var minuteTimer:Timer = new Timer(1000, 5); // designates listeners for the interval and completion events minuteTimer.addEventListener(TimerEvent.TIMER, onTick); minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); // starts the timer ticking minuteTimer.start(); } public function onTick(event:TimerEvent):void { // displays the tick count so far // The target of this event is the Timer instance itself. trace("tick " + event.target.currentCount); } public function onTimerComplete(event:TimerEvent):void { trace("Time's Up!"); } } }
1.2 字符串
* 字符串
//定义字符串 var str1:String = "hello"; var str2:String = 'hello'; var str3:String = new String("hello"); var str4:String = new String("hello is \"HELLO\" !"); //引号转义 var str5:String = null; var str6:String = "";
* 转义字符
转义序列 字符
\b Backspace
\f 换页符
\n 换行符
\r 回车符
\t Tab
\unnnn Unicode 字符,字符代码由十六进制数字 nnnn 指定;例如,\u263a 为笑脸字符。
\\xnn ASCII 字符,字符代码由十六进制数字 nn 指定。
\' 单引号
\" 双引号
\\ 单个反斜杠字符
* 字符串属性
长度:var len:Int = str1.length;
* 字符串方法
//返回字符 str1.charAt(1): //返回hello中e str1.charCodeAt(1): //返回hello中e的ASCII码101 //比较字符串 //比较运算符 <、<=、!= 、==、=> 和 > //字符串转换 var n:Number = 3.1425926; var str2:String = n.toString(); //字符串连接 var str3:String = "PI is "; var str4:String = str3 + str2; // var str5:String = str2.concat(" ",str3," ",n); str5 += " !!!"; //字符串截取 var str6:String = "Hello from Paris, Texas!!!"; var str7:String = str6.substr(11,15); // 15为截取的长度 var str8:String = str6.substring(11,15); // 15为str6结束处字符位置 var str9:String = str6.slice(11,15); //15为截取的长度 var str10:String= str6.slice(-3,-1); //从末尾开始向开头位置截取1个字符 //查找匹配字符串 str6.indexOf("h"); str6.lastIndexOf("p",11); //分隔字符串成数组 var query:String = "a=23&b=200&c=user" var paras:Array = query.split("&",2); //第2个参数表示返回数组的最大大小 //正则表达式分隔数组 var str11:String = "Give me\t5." var a:Array = str11.split(/\s+/); // a == ["Give","me","5."] str11.toLowerCase(); str11.toUpperCase();
1.3 数组
* Array,Vector,关联数组,Dictionary,多维数组
//Array为任意类型的数组 var names:Array = new Array(3); var oddNumbers:Array = [1, 3, 5, 7, 9, 11]; var names:Array = new Array("John","Jane","David"); //Vector为指定类型的数组,性能比Array快,类型检查 var v:Vector.<String> = new Vector.<String>(); var v:Vector.<int> = new <int>[0,1,2,]; //尾部逗号为可选,数组中不支持空项 var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]); //Vector.<T>() 全局函数 //数组插入元素 var planets:Array = new Array(); planets.push("Mars"); //在末尾添加 planets.unshift("Mercury"); // 在开头添加 planets.splice(1, 0, "Venus", "Earth"); //在指定索引位添加 //检索和删除数组元素 var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"]; var first:String = oceans[0]; //检索元素 oceans.pop(); //删除末尾一个元素 oceans.shift(); //删除开头一个元素 oceans.splice(startIndex, deleteCnt, "Arctic", "Atlantic"); //从指定索引位开始,删除指定长度的元素,并添加后两项字符串 //排序 oceans.reverse(); //反转 oceans.sort(); //按预定义方式排序 oceans.sort(Array.CASEINSENSITIVE); // Array.DESCENDING | Array.CASEINSENSITIVE oceans.sortOn(); //按某属性排序 //查询数组 //方法concat()、join() 、slice() 和 toString() //关联数组 var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"}; var tp:String =monitorInfo["type"]; var monitorInfo:Array = new Array(); monitorInfo["type"] = "Flat Panel"; monitorInfo["resolution"] = "1600 x 1200"; //字典 import flash.display.Sprite; import flash.utils.Dictionary; var groupMap:Dictionary = new Dictionary(); // objects to use as keys var spr1:Sprite = new Sprite(); var spr2:Sprite = new Sprite(); var spr3:Sprite = new Sprite(); // objects to use as values var groupA:Object = new Object(); var groupB:Object = new Object(); // Create new key-value pairs in dictionary. groupMap[spr1] = groupA; groupMap[spr2] = groupB; groupMap[spr3] = groupB; if (groupMap[spr1] == groupA) { trace("spr1 is in groupA"); } if (groupMap[spr2] == groupB) { trace("spr2 is in groupB"); } if (groupMap[spr3] == groupB) { trace("spr3 is in groupB"); } //循环访问 for (var key:Object in groupMap) { trace(key, groupMap[key]); }
//多维数组 var masterTaskList:Array = new Array(); masterTaskList[0] = ["wash dishes", "take out trash"]; masterTaskList[1] = ["wash dishes", "pay bills"]; masterTaskList[2] = ["wash dishes", "dentist", "wash dog"]; masterTaskList[3] = ["wash dishes"]; masterTaskList[4] = ["wash dishes", "clean house"]; masterTaskList[5] = ["wash dishes", "wash car", "pay rent"]; masterTaskList[6] = ["mow lawn", "fix chair"]; //克隆数组 //通过调用不带参数的 concat() 或 slice() 方法,实现浅拷贝,仅复制指向对象的引用而非对象本身 //将数组序列化为 ByteArray 类的实例,然后将此数组读回到新数组中实现深拷贝 import flash.utils.ByteArray; function clone(source:Object):* { var myBA:ByteArray = new ByteArray(); myBA.writeObject(source); myBA.position = 0; return(myBA.readObject()); } //数组扩展 //page 37
* 内存管理及垃圾回收
FlashPlayer 和AIR使用垃圾回收系统来恢复不再使用的内存。当对象不具有指向它的引用时,即可对其进行垃圾回收,并会在下次执行垃圾回收系统时恢复内存。
//对象删除引用 import flash.utils.Dictionary; var myObject:Object = new Object(); var myMap:Dictionary = new Dictionary(); myMap[myObject] = "foo"; myObject = null; delete myMap[myObject];
垃圾回收方法:
1)删除对象的引用
2)删除对象子对象的引用 及 删除对象对子对象的引用
3)对象引用外部对象,删除时要将对象的引用设置为null
4)系统组件,全局工具,管理类有提供卸载方法或者资源回收方法,需先调用,否则会造成内存泄露和性能损失
5)父对象被删除,子对象可能立即删除,也可能延迟到后期被系统自动删除,或者第二次移除操作时被删除
6)注册的事件监听器在用完时移除
1.4 处理错误
//try..catch..finally语句结构 var fileRef:FileReference = new FileReference(); try { fileRef.upload(new URLRequest("http://www.yourdomain.com/fileupload.cfm")); } catch (error:IllegalOperationError) { trace(error); // Error #2037: Functions called in incorrect sequence, or earlier // call was unsuccessful. }
1.throw语句抛出异常
2.自定义错误类
3.未捕获的错误,运行时UncaughtErrorEvents 对象调度此事件uncaughtError事件
4.核心错误类见page55
1.5 正则表达式
//创建正则表达式 var pattern1:RegExp = /bob/i; //正斜杠字符 ( / ) 来界定正则表达式 var pattern2:RegExp = new RegExp("bob", "i");
元字符: ^ $ \ . * + ? ( ) [ ] { } | 见page66
元序列:{n} {n,} {n,n} … 见page67
字符类:
数组表示符:
逻辑或:
组:
标志和属性:
…
1.6 使用XML
page80
//读取外部xml文档
import flash.events.Event; import flash.net.URLLoader; var myXML:XML = new XML(); var XML_URL:String = "http://www.example.com/Sample3.xml"; var myXMLURL:URLRequest = new URLRequest(XML_URL); var myLoader:URLLoader = new URLLoader(myXMLURL); myLoader.addEventListener(Event.COMPLETE, xmlLoaded); function xmlLoaded(event:Event):void { myXML = XML(myLoader.data); trace("Data loaded."); }
1.7 使用Json功能
* 顶级类JSON提供两个方法来进行字符串到AS对象的相互转换。
JSON.parse(text:String, reviver:Function = null):Object
接受 JSON 格式的字符串并返回表示该值的 ActionScript 对象,reviver函数用来自定义解码实现。
(Page103)
JSON.stringify(value:Object, replacer:* = null, space:* = null):String
返回 JSON 格式的字符串,用于表示 ActionScript 值,replacer函数用来自定义编码实现。
JSON.stringify(d, function (k,v):* { return "any date format you like via replacer: "+ "holder[k].time:"+this[k].time + " holder[k].hours:"+this[k].hours; });
* JSON API包括toJSON()成员函数,但是类内部不提供任何成员的ActionScript 类的导入和导出。JSON 将遍历所遇到的每一个对象的公共属性。如果一个对象包含其他对象,JSON 将以递归形式访问嵌套对象,并执行相同的遍历。如果任何对象提供toJSON() 方法,JSON 将使用该自定义方法,而不是其内部算法。
AS允许任何类在原型上定义或重新定义toJSON()方法来重现实现JSON编码。如对系统内置类MovieClip的原型类定义toJSON().
MovieClip.prototype.toJSON = function(k):* { trace("prototype.toJSON() called."); return "MovieClip toJSON"; }
1.8 处理事件
Page106
1.9 应用程序域
ApplicationDomain 类的用途是存储AS3定义表。SWF 文件中的所有代码被定义为存在于应用程序域中。可以使用应用程序域划分位于同一个安全域中的类。这允许同一个类存在多个定义,并且还允许子级重用父级定义。使用 Loader 类 API 加载用AS3编写的外部 SWF 文件时,可以使用应用程序域。(请注意,在加载图像或用AS1或AS2编写的 SWF 文件时不能使用应用程序域。)包含在已加载类中的所有AS3定义都存储在应用程序域中。加载SWF文件时,通过将 LoaderContext 对象的 applicationDomain 参数设置为ApplicationDomain.currentDomain,可以指定文件包含在 Loader 对象所在的相同应用程序域中。通过将加载的 SWF 文件放在同一个应用程序域中,可以直接访问它的类。如果加载的 SWF 文件包含嵌入的媒体(可通过其关联的类名称访问),或者您要访问加载的 SWF 文件的方法.
package { import flash.display.Loader; import flash.display.Sprite; import flash.events.*; import flash.net.URLRequest; import flash.system.ApplicationDomain; import flash.system.LoaderContext; public class ApplicationDomainExample extends Sprite { private var ldr:Loader; public function ApplicationDomainExample() { ldr = new Loader(); var req:URLRequest = new URLRequest("Greeter.swf"); var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); ldr.load(req, ldrContext);
}
private function completeHandler(event:Event):void { var myGreeter:Class = ApplicationDomain.currentDomain.getDefinition("Greeter") as Class; var myGreeter:Greeter = Greeter(event.target.content); var message:String = myGreeter.welcome("Tommy"); trace(message); // Hello, Tommy }
}
}
• SWF 文件中的所有代码被定义为存在于应用程序域中。主应用程序在 “ 当前域” 中运行。“ 系统域” 中包含所有应用程序域(包括当前域),也就是包含所有 Flash Player 类。
• 所有应用程序域(除系统域外)都有关联的父域。主应用程序的应用程序域的父域是系统域。已加载的类仅在其父级中没有相关定义时才进行定义。不能用较新的定义覆盖已加载类的定义。
声明:本站未注明转载的文章均属本人原创文章,文中所涉及文字、图片、图表、Logo、页面版式以及其他信息等内容均受版权、标签和其它财产所有权法律的保护,请勿用于任何形式的商业用途,转载请保留该声明,并注明出处。茶沫:http://www.cnblogs.com/janas/ 欢迎沟通交流:nofulls@gmail.com