第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  类。
• 所有应用程序域(除系统域外)都有关联的父域。主应用程序的应用程序域的父域是系统域。已加载的类仅在其父级中没有相关定义时才进行定义。不能用较新的定义覆盖已加载类的定义。

appdomain

 

 

声明:本站未注明转载的文章均属本人原创文章,文中所涉及文字、图片、图表、Logo、页面版式以及其他信息等内容均受版权、标签和其它财产所有权法律的保护,请勿用于任何形式的商业用途,转载请保留该声明,并注明出处。茶沫:http://www.cnblogs.com/janas/ 欢迎沟通交流:nofulls@gmail.com

posted @ 2013-05-19 19:55  全栈深入  阅读(2556)  评论(0编辑  收藏  举报