转换对象

动作脚本 2.0 允许将一种数据类型转换为另一种数据类型。Flash 使用的转换运算符采用函数调用的形式,并且符合 ECMA-262 版本 4 建议中指定的显式强制。转换允许您声明一个对象属于某一类型,这样,在执行类型检查时,编译器会将该对象视作具有一组其原始类型不包含的属性。例如,在迭代一组类型可能不同的对象时,这将很有用。

在为 Flash Player 7 或更高版本发布的文件中,在运行时失败的转换语句返回 null。在为 Flash Player 6 发布的文件中,未实现对失败转换的任何运行时支持。

转换的语法为 type(item),表示您希望编译器将 item 视作数据类型为 type 的项目。转换实质上是一个函数调用,如果转换失败,该函数调用将返回 null。如果转换成功,该函数调用将返回原对象。但是,将项目转换为在外部类文件中创建的数据类型时,即使转换在运行时失败,编译器也不会生成类型不匹配错误。

// 在 Animal.as 中
class Animal {}

// 在 Dog.as 中
class Dog extends Animal { function bark (){} }

// 在 Cat.as 中
class Cat extends Animal { function meow (){} }

// 在 FLA 文件中
var spot:Dog = new Dog();   
var temp:Cat = Cat (spot);  // 声明一个 Dog 对象的类型为 Cat
temp.meow(); // 不执行任何动作,但也不生成任何编译器错误

在此示例中,您向编译器声明了 temp 是一个 Cat 对象,因此,编译器认为 temp.meow() 是一条合法语句。但是,编译器不知道该转换将失败(即,您尝试将一个 Dog 对象转换为 Cat 类型),因此不会发生任何编译时错误。如果在脚本中加入一条检查语句,检查转换是否成功,在运行时您会发现类型不匹配错误。

var spot:Dog = new Dog();
var temp:Cat = Cat (spot);
trace(temp);  // 在运行时显示 null

可以将表达式的类型转换为接口。如果该表达式是一个实现该接口的对象,或具有实现该接口的基类,则返回该对象。否则,将返回 null

下面的示例显示转换内置对象类型的结果。如 with(results) 代码块中的第一行所示,非法转换(在此示例中为将字符串转换为影片剪辑)将返回 null。如最后两行所示,转换为 null 或 undefined 将返回 undefined

var mc:MovieClip;
var arr:Array;
var bool:Boolean;
vvar num3:Number;
var obj:Object;
var str:String;
_root.createTextField("results",2,100,100,300,300);
with(results){
text = "type MovieClip :"+(typeof MovieClip(str));     // 返回 null
text += "\ntype object :"+(typeof Object(str));        // 返回 object
text += "\ntype Array :"+(typeof Array(num3));         // 返回 object
text += "\ntype Boolean :"+(typeof Boolean(mc));       // 返回 boolean
text += "\ntype String :"+(typeof String(mc));         // 返回 string
text += "\ntype Number :"+(typeof Number(obj));        // 返回 number
text += "\ntype Function :"+(typeof Function(mc));     // 返回 object
text += "\ntype null :"+(typeof null(arr));            // 返回 undefined
text += "\ntype undefined :"+(typeof undefined(obj));  // 返回 undefined
}
//“输出”面板中的结果
type MovieClip :null
type object :object
type Array :object
type Boolean :boolean
type String :string
type Number :number
type Function :object
type null :undefined
type undefined :undefined

原始数据类型(例如,Boolean、Date 和 Number)不能用名称相同的转换运算符覆盖。