as3中如何for in,flash模块

Flash as 3.0语言基本元素 数据类型(5种基本数据类型):                   Boolean(又称布尔值);若声明后未初始化,则默认为false;                   int(用来处理整数,,32位整型数);                   unit(用来处理很大的正整数);                   Number(用来 处理很长又有小数点的数字,,64位浮点值); 阅读详情
什么是反射
反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式. 诸如实现动态创建类实例, 方法等. 在很语言中都有相关的的实现, 如 Java 和 c# 等

反射有什么用
在 as3 与 as2 不同, 类实例中任何元素, 如变量 (variable), 访问器 (accessor, 即 getter / setter), 方法 (method) 都是不可被 for..in 遍历的 (不是默认哦, 目前我还没找到办法可以让他被遍历),
并且不管你是否继承自 Object (默认继承就是 Object, 不写也一样), 是否把类声明为 dynamic.
或许有人会问自然是 Object 的子类, 不是可以用 setPropertyIsEnumerable 来设置是否隐藏变量么.

很遗憾的是经过的我的尝试, 在类里使用 setPropertyIsEnumerable("属性名") 编译器报告方法可能未定义.
随后尝试 super.setPropertyIsEnumerable("属性名"), 编译通过但抛运行时错误, 同样是方法未定义 -_-
而其他方法诸如 propertyIsEnumerable("属性名") 却可以正常使用

新建一个 ActionScript 项目, 分别创建下面 2 个类:

Dummy.as

package
{
public dynamic class Dummy extends Object
{

public var variable1:String;
public function Dummy () {
variable1 = "我是字符串";

// 使用下面 2 个句子分别会报告编译时错误和运行时错误
// setPropertyIsEnumerable("variable1");
// super.setPropertyIsEnumerable("accessorOfVar1");
}

public function get accessorOfVar1 ():String {
return "通过访问器访问, variable1 : " + variable1;
}

}
}

ReflectionSample.as

package {
import flash.display.Sprite;


public class ReflectionSample extends Sprite
{
public function ReflectionSample () {
testPropsEnumeration();
}



/**
* 测试 for..in 遍历
*
*/
private function testPropsEnumeration ():void {
trace("测试 for..in 循环, 遍历 Dummy 的实例");
var dummy:Dummy = new Dummy();

for (var i:String in dummy)
trace( i + " : " + dummy[i] );
}
}
}

最后测试 ReflectionSample, 记得用 debug 模式. 控制台中只会出现:

QUOTE:
------------------------------------------------------------
测试 for..in 循环, 遍历 Dummy 的实例
------------------------------------------------------------

显然 dummy 中的元素都没有被遍历出.

在 as1, 2 中很简单就可以实现的问题在 as3 得换个办法了, 谁让他们是传统的脚本语言呢.而在 as3 中, 就得通过反射来解决这个问题了. 方法会在文后介绍

动态创建实例

* 这部分内容帮助中已经有例子, 我摘要一些翻译一下, 不过我的 e 文很烂. 希望大 家能看得懂.

as3 使用 flash.util.getDefinitionByName 动态获取类 (Class) 引用
帮助中该方法的描述 :

QUOTE:
------------------------------------------------------------
public function getDefinitionByName(name:String):Object
返回参数 name 中指定的类引用

参数 name:String - 类名称
返回 Object - 返回参数 name 中指定的类引用
错误 ReferenceError - 找不到参数 name 对应的公共定义
------------------------------------------------------------

使用方法如下:

获取类 flash.text.TextField 的引用. as 语句是无异常的类型转换. 如果转换失败那么目标变量将被设置成 null

var ClassReference:Class = getDefinitionByName("flash.text.TextField") as Class;

实例化所引用的类, 并设置一些属性

var instance:TextField = new ClassReference() as TextField;
instance.autoSize = "left";
instance.text = "我通过 getDefinitionByName 动态创建";

最后添加到场景中并显示

addChild(instance);

修改后的 ReflectionSample.as:

package {
import flash.display.Sprite;
import flash.utils.getDefinitionByName;
import flash.text.TextField;

public class ReflectionSample extends Sprite
{
public function ReflectionSample () {
getDefinitionByNameSample();
}

/**
* 使用 flash.utils.getDefinitionByName 动态获取类 (Class) 并创建实例
*
*/
private function getDefinitionByNameSample ():void {
var ClassReference:Class = getDefinitionByName("flash.text.TextField") as Class;
var instance:TextField = new ClassReference() as TextField;
instance.autoSize = "left";
instance.text = "我通过 getDefinitionByName 动态创建";
addChild(instance);
}

}
}

动态获取类名称, 超类 (Superclass) 名称
有点像之前版本中的 typeof, 这个方法返回的是字符串

QUOTE:
------------------------------------------------------------
public function getQualifiedClassName(value:*):String
返回类的完全限定名 (fully qualified class name, qualified 我不知道怎么翻了..)

参数 value:* - 想要得到完全限定名的对象. 他可以是任何 ActionScript 类型, 对象实例, 简单类型如 uint 以及类类型.
返回 String - 包含类的完全限定名的字符串
------------------------------------------------------------

QUOTE:
------------------------------------------------------------
public function getQualifiedSuperclassName(value:*):String
返回目标对象基类的完全限定名,
本函数提供比 describeType 更简便的方法来获取基类的名称
提示: 本函数限制只寻找实例的继承层次,而 describeType() 函数使用的是类对象继承.
调用 describeType() 函数时返回的是基于超类以的类继承结构. 而 getQualifiedSuperclassName() 将忽略类的继承结构直接返回最接近的继承对象
例如, 理论上 String 类继承自 Class, 但调用 getQualifiedSuperclassName(String) 时返回的是 Object. 换句话说, 不管你传递的是类还是类的实例, 他们的返回值都是一样的

参数 value:* - 任何值.
返回 String - 基类的完全限定名, 如果没有的话返回 null
------------------------------------------------------------

例子:

实例化新的 Sprite, 然后获取他的类名并输出

var sprite1:Sprite = new Sprite();
var classNameOfSprite:String = getQualifiedClassName(Sprite);
trace("Sprite 的类名 : " + classNameOfSprite); // Sprite 的类名 : flash.display::Sprite

超类

var superclassNameOfSprite:String = getQualifiedSuperclassName(Sprite);
trace("Sprite 的超类 (基类) 类名 : " + superclassNameOfSprite); // Sprite 的超类 (基类) 类名 : flash.display::DisplayObjectContainer

根据刚刚获取的类名使用 创建实例

var SpriteClass:Class = getDefinitionByName(classNameOfSprite) as Class;
var sprite2:Sprite = new SpriteClass() as Sprite;
trace("sprite2 通过 getDefinitionByName 创建 Sprite 实例");

画一个 100 x 100 的矩形并显示

sprite2.graphics.beginFill(0xFF00FF);
sprite2.graphics.drawRect(0, 0, 100, 100);
sprite2.graphics.endFill();
addChild(sprite2);

修改后的 ReflectionSample.as

package {
import flash.display.Sprite;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.utils.getQualifiedSuperclassName;

public class ReflectionSample extends Sprite
{
public function ReflectionSample () {
getClassNameSample();
}

/**
* 使用 flash.utils.getQualifiedClassName 和 getQualifiedSuperclassName 获取类名称, 并动态创建该类
*
*/
private function getClassNameSample ():void {
var sprite1:Sprite = new Sprite();
var classNameOfSprite:String = getQualifiedClassName(Sprite);
trace("Sprite 的类名 : " + classNameOfSprite);

var superclassNameOfSprite:String = getQualifiedSuperclassName(Sprite);
trace("Sprite 的超类 (基类) 类名 : " + superclassNameOfSprite);

var SpriteClass:Class = getDefinitionByName(classNameOfSprite) as Class;
var sprite2:Sprite = new SpriteClass() as Sprite;
trace("sprite2 通过 getDefinitionByName 创建 Sprite 实例");

sprite2.graphics.beginFill(0xFF00FF);
sprite2.graphics.drawRect(0, 0, 100, 100);
sprite2.graphics.endFill();
addChild(sprite2);
}


}
}

获取类信息

QUOTE:
------------------------------------------------------------
public function describeType(value:*):XML
生成一个 XML 对象来描述参数中指定的 ActionScript 对象, 这个方法使 ActionScript 实现了反射编程的概念.

如果参数 value 是某类的实例, 那么返回的 XML 对象包含了此类中所有的实例属性, 但是不会包含任何的静态属性.
这种情况下你可以通过检查标签 <type> 中的 isStatic 属性来判断他, 当参数为某类的实例时, 这个值为 false.

要获取类的静态属性, 可以通过传递类本身到参数 value, 这样返回的 XML 对象不仅包括了类的静态属性, 也包括所有的实例属性.
实例属性被包含在 <factory> 标签中使它们和静态属性区别开来. 在这种情况下, <type> 标签的 isStatic 属性为 true.

提示: 如果你只需要获取对象的继承结构而不需要 describeType() 提供的其他信息, 可以使用 getQualifiedClassName() 和 getQualifiedSuperclassName() 来替代

下表描述了 describeType() 生成的 XML 的标签和属性
------------------------------------------------------------

标签 属性 说明
<type> XML 对象的根标签
name ActionScript 对象 (ActionScript object) 类型
base 当前对象的直属超类, 如果当前 ActionScript 对象是类对象, 那那么该值为 Class.
isDynamic 如果当前 ActionScript 对象被定义为 dynamic, 那么该属性为 true, 否则为 false. 如果当前 ActionScript 对象是类对象, 那么该属性也为 true, 因为 Class 类是 dynamic 的
isFinal 如果当前 ActionScript 对象被定义为 final, 那么该属性为 true, 否则为 false
isStatic 如果当前 ActionScript 是类对象或者构造函数, 那么该属性为 true, 否则为 false. 该属性被命名为 isStatic 是因为如果值为 true 的话, 任何标签都不会被嵌套到 factory 标签中
<extendsClass> 使用 extendsClass 标签分别存放当前 ActionScript 对象的超类
type 当前 ActionScript 对象所继承的超类的名字
<implementsInterface> 使用 implementsInterface 标签分别存放当前 ActionScript 对象, 以及他的超类所实现的接口
type 当前 ActionScript 所实现的接口的名字
<accessor> 访问器是由 getter 和 setter 所定义的属性
name 该访问器的名字
access 该访问器的访问权限. 可能的值有 readonly, writeonly, 和 readwrite.
type 该属性的数据类型
declaredBy 指示由哪个类定义了该访问器
<constant> 常量是由 const 所定义的属性
name 该常量的名称
type 该常量的数据类型
<method> 方法是由类定义的一部分公开的函数
name 方法名
declaredBy 指示该方法由哪个类定义
returnType 方法的返回类型
<parameter> 使用 parameter 分别存放该方法的参数, 该标签被嵌套在 <method> 中
index 一个数字指示当前参数被传递时所在函数中的位置, 如果是首个参数, 那么该值为 1
type 该参数的类型
optional 如果该参数为可选的话为 true, 否则为 false
<variable> 变量 (variable) 是由 var 语句所定义的变量
name 变量名
type 变量类型
<factory> 如果当前 ActionScript 对象是类对象或者构造函数, 所有的实例属性将会被嵌套进该标签. 如果 <type> 标签的 isStatic 属性为 true, 所有属性 (properties) 和方法 (method) 将不会被嵌套进改标签中. 该标签只出现在当前 ActionScript 对象是类对象或者构造函数的情况下


另外, 由 describeType() 返回的类描述信息中只会含有所有可被访问的元素, 即所有非定义为 private 的元素.

解释了这么多, 我们来看看返回的 XML 格式
flash 的内置类 flash.display.Sprite :

trace(describeType(Sprite);

返回:

<type name="flash.display::Sprite" base="Class" isDynamic="true" isFinal="true" isStatic="true">
<extendsClass type="Class"/>
<extendsClass type="Object"/>
<accessor name="prototype" access="readonly" type="*" declaredBy="Class"/>
<factory type="flash.display::Sprite">
<extendsClass type="flash.display::DisplayObjectContainer"/>
<extendsClass type="flash.display::InteractiveObject"/>
<extendsClass type="flash.display::DisplayObject"/>
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
<implementsInterface type="flash.display::IBitmapDrawable"/>
<implementsInterface type="flash.events::IEventDispatcher"/>
<accessor name="hitArea" access="readwrite" type="flash.display::Sprite" declaredBy="flash.display::Sprite"/>
<method name="startDrag" declaredBy="flash.display::Sprite" returnType="void">
<parameter index="1" type="Boolean" optional="true"/>
<parameter index="2" type="flash.geom::Rectangle" optional="true"/>
</method>
<accessor name="buttonMode" access="readwrite" type="Boolean" declaredBy="flash.display::Sprite"/>
<accessor name="graphics" access="readonly" type="flash.display::Graphics" declaredBy="flash.display::Sprite"/>
<accessor name="soundTransform" access="readwrite" type="flash.media::SoundTransform" declaredBy="flash.display::Sprite"/>
<method name="stopDrag" declaredBy="flash.display::Sprite" returnType="void"/>
<accessor name="dropTarget" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::Sprite"/>
<accessor name="useHandCursor" access="readwrite" type="Boolean" declaredBy="flash.display::Sprite"/>
<method name="getChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="int" optional="false"/>
</method>
<method name="addChild" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="swapChildren" declaredBy="flash.display::DisplayObjectContainer" returnType="void">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
<parameter index="2" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="getChildByName" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="String" optional="false"/>
</method>
<method name="getObjectsUnderPoint" declaredBy="flash.display::DisplayObjectContainer" returnType="Array">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="textSnapshot" access="readonly" type="flash.text::TextSnapshot" declaredBy="flash.display::DisplayObjectContainer"/>
<method name="removeChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="int" optional="false"/>
</method>
<method name="getChildIndex" declaredBy="flash.display::DisplayObjectContainer" returnType="int">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="areInaccessibleObjectsUnderPoint" declaredBy="flash.display::DisplayObjectContainer" returnType="Boolean">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="mouseChildren" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObjectContainer"/>
<method name="removeChild" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="setChildIndex" declaredBy="flash.display::DisplayObjectContainer" returnType="void">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
<parameter index="2" type="int" optional="false"/>
</method>
<method name="contains" declaredBy="flash.display::DisplayObjectContainer" returnType="Boolean">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="addChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
<parameter index="2" type="int" optional="false"/>
</method>
<accessor name="numChildren" access="readonly" type="int" declaredBy="flash.display::DisplayObjectContainer"/>
<method name="swapChildrenAt" declaredBy="flash.display::DisplayObjectContainer" returnType="void">
<parameter index="1" type="int" optional="false"/>
<parameter index="2" type="int" optional="false"/>
</method>
<accessor name="tabChildren" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObjectContainer"/>
<accessor name="tabEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/>
<accessor name="doubleClickEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/>
<accessor name="contextMenu" access="readwrite" type="flash.ui::ContextMenu" declaredBy="flash.display::InteractiveObject"/>
<accessor name="accessibilityImplementation" access="readwrite" type="flash.accessibility::AccessibilityImplementation" declaredBy="flash.display::InteractiveObject">
<metadata name="Inspectable">
<arg key="environment" value="none"/>
</metadata>
</accessor>
<accessor name="mouseEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/>
<accessor name="focusRect" access="readwrite" type="Object" declaredBy="flash.display::InteractiveObject"/>
<accessor name="tabIndex" access="readwrite" type="int" declaredBy="flash.display::InteractiveObject"/>
<accessor name="mask" access="readwrite" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
<accessor name="scaleX" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="scaleY" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<method name="getRect" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="mouseY" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="alpha" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="x" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="name" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
<accessor name="y" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="root" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
<accessor name="width" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="stage" access="readonly" type="flash.display::Stage" declaredBy="flash.display::DisplayObject"/>
<accessor name="loaderInfo" access="readonly" type="flash.display::LoaderInfo" declaredBy="flash.display::DisplayObject"/>
<accessor name="transform" access="readwrite" type="flash.geom::Transform" declaredBy="flash.display::DisplayObject"/>
<accessor name="height" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<method name="localToGlobal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="filters" access="readwrite" type="Array" declaredBy="flash.display::DisplayObject"/>
<accessor name="blendMode" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
<accessor name="rotation" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<method name="hitTestObject" declaredBy="flash.display::DisplayObject" returnType="Boolean">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="scale9Grid" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
<accessor name="accessibilityProperties" access="readwrite" type="flash.accessibility::AccessibilityProperties" declaredBy="flash.display::DisplayObject"/>
<accessor name="scrollRect" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
<accessor name="cacheAsBitmap" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
<method name="globalToLocal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<method name="getBounds" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="opaqueBackground" access="readwrite" type="Object" declaredBy="flash.display::DisplayObject"/>
<accessor name="parent" access="readonly" type="flash.display::DisplayObjectContainer" declaredBy="flash.display::DisplayObject"/>
<method name="hitTestPoint" declaredBy="flash.display::DisplayObject" returnType="Boolean">
<parameter index="1" type="Number" optional="false"/>
<parameter index="2" type="Number" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
</method>
<accessor name="visible" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
<accessor name="mouseX" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
<method name="willTrigger" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="String" optional="false"/>
</method>
<method name="removeEventListener" declaredBy="flash.events::EventDispatcher" returnType="void">
<parameter index="1" type="String" optional="false"/>
<parameter index="2" type="Function" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
</method>
<method name="toString" declaredBy="flash.events::EventDispatcher" returnType="String"/>
<method name="addEventListener" declaredBy="flash.events::EventDispatcher" returnType="void">
<parameter index="1" type="String" optional="false"/>
<parameter index="2" type="Function" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
<parameter index="4" type="int" optional="true"/>
<parameter index="5" type="Boolean" optional="true"/>
</method>
<method name="dispatchEvent" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="flash.events::Event" optional="false"/>
</method>
<method name="hasEventListener" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="String" optional="false"/>
</method>
</factory>
</type>


真是又臭又长啊. :o, 根据帮助中的描述, 所有的实例属性都被嵌套在了 <factory> 标签里.

我们再试一下获取实例的信息 :

var sprite1:Sprite = new Sprite();
var instanceInfo:XML = describeType(sprite1);

返回 :

代码拷贝框
<type name="flash.display::Sprite" base="flash.display::DisplayObjectContainer" isDynamic="false" isFinal="false" isStatic="false">
<extendsClass type="flash.display::DisplayObjectContainer"/>
<extendsClass type="flash.display::InteractiveObject"/>
<extendsClass type="flash.display::DisplayObject"/>
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
<implementsInterface type="flash.display::IBitmapDrawable"/>
<implementsInterface type="flash.events::IEventDispatcher"/>
<accessor name="hitArea" access="readwrite" type="flash.display::Sprite" declaredBy="flash.display::Sprite"/>
<method name="startDrag" declaredBy="flash.display::Sprite" returnType="void">
<parameter index="1" type="Boolean" optional="true"/>
<parameter index="2" type="flash.geom::Rectangle" optional="true"/>
</method>
<accessor name="buttonMode" access="readwrite" type="Boolean" declaredBy="flash.display::Sprite"/>
<accessor name="graphics" access="readonly" type="flash.display::Graphics" declaredBy="flash.display::Sprite"/>
<accessor name="soundTransform" access="readwrite" type="flash.media::SoundTransform" declaredBy="flash.display::Sprite"/>
<method name="stopDrag" declaredBy="flash.display::Sprite" returnType="void"/>
<accessor name="dropTarget" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::Sprite"/>
<accessor name="useHandCursor" access="readwrite" type="Boolean" declaredBy="flash.display::Sprite"/>
<method name="getChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="int" optional="false"/>
</method>
<method name="addChild" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="swapChildren" declaredBy="flash.display::DisplayObjectContainer" returnType="void">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
<parameter index="2" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="getChildByName" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="String" optional="false"/>
</method>
<method name="getObjectsUnderPoint" declaredBy="flash.display::DisplayObjectContainer" returnType="Array">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="textSnapshot" access="readonly" type="flash.text::TextSnapshot" declaredBy="flash.display::DisplayObjectContainer"/>
<method name="removeChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="int" optional="false"/>
</method>
<method name="getChildIndex" declaredBy="flash.display::DisplayObjectContainer" returnType="int">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="areInaccessibleObjectsUnderPoint" declaredBy="flash.display::DisplayObjectContainer" returnType="Boolean">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="mouseChildren" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObjectContainer"/>
<method name="removeChild" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="setChildIndex" declaredBy="flash.display::DisplayObjectContainer" returnType="void">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
<parameter index="2" type="int" optional="false"/>
</method>
<method name="contains" declaredBy="flash.display::DisplayObjectContainer" returnType="Boolean">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<method name="addChildAt" declaredBy="flash.display::DisplayObjectContainer" returnType="flash.display::DisplayObject">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
<parameter index="2" type="int" optional="false"/>
</method>
<accessor name="numChildren" access="readonly" type="int" declaredBy="flash.display::DisplayObjectContainer"/>
<method name="swapChildrenAt" declaredBy="flash.display::DisplayObjectContainer" returnType="void">
<parameter index="1" type="int" optional="false"/>
<parameter index="2" type="int" optional="false"/>
</method>
<accessor name="tabChildren" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObjectContainer"/>
<accessor name="tabEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/>
<accessor name="doubleClickEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/>
<accessor name="contextMenu" access="readwrite" type="flash.ui::ContextMenu" declaredBy="flash.display::InteractiveObject"/>
<accessor name="accessibilityImplementation" access="readwrite" type="flash.accessibility::AccessibilityImplementation" declaredBy="flash.display::InteractiveObject">
<metadata name="Inspectable">
<arg key="environment" value="none"/>
</metadata>
</accessor>
<accessor name="mouseEnabled" access="readwrite" type="Boolean" declaredBy="flash.display::InteractiveObject"/>
<accessor name="focusRect" access="readwrite" type="Object" declaredBy="flash.display::InteractiveObject"/>
<accessor name="tabIndex" access="readwrite" type="int" declaredBy="flash.display::InteractiveObject"/>
<accessor name="mask" access="readwrite" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
<accessor name="scaleX" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="scaleY" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<method name="getRect" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="mouseY" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="alpha" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="x" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="name" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
<accessor name="y" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="root" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
<accessor name="width" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<accessor name="stage" access="readonly" type="flash.display::Stage" declaredBy="flash.display::DisplayObject"/>
<accessor name="loaderInfo" access="readonly" type="flash.display::LoaderInfo" declaredBy="flash.display::DisplayObject"/>
<accessor name="transform" access="readwrite" type="flash.geom::Transform" declaredBy="flash.display::DisplayObject"/>
<accessor name="height" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<method name="localToGlobal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<accessor name="filters" access="readwrite" type="Array" declaredBy="flash.display::DisplayObject"/>
<accessor name="blendMode" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
<accessor name="rotation" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
<method name="hitTestObject" declaredBy="flash.display::DisplayObject" returnType="Boolean">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="scale9Grid" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
<accessor name="accessibilityProperties" access="readwrite" type="flash.accessibility::AccessibilityProperties" declaredBy="flash.display::DisplayObject"/>
<accessor name="scrollRect" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
<accessor name="cacheAsBitmap" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
<method name="globalToLocal" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Point">
<parameter index="1" type="flash.geom::Point" optional="false"/>
</method>
<method name="getBounds" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
<parameter index="1" type="flash.display::DisplayObject" optional="false"/>
</method>
<accessor name="opaqueBackground" access="readwrite" type="Object" declaredBy="flash.display::DisplayObject"/>
<accessor name="parent" access="readonly" type="flash.display::DisplayObjectContainer" declaredBy="flash.display::DisplayObject"/>
<method name="hitTestPoint" declaredBy="flash.display::DisplayObject" returnType="Boolean">
<parameter index="1" type="Number" optional="false"/>
<parameter index="2" type="Number" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
</method>
<accessor name="visible" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
<accessor name="mouseX" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
<method name="willTrigger" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="String" optional="false"/>
</method>
<method name="removeEventListener" declaredBy="flash.events::EventDispatcher" returnType="void">
<parameter index="1" type="String" optional="false"/>
<parameter index="2" type="Function" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
</method>
<method name="toString" declaredBy="flash.events::EventDispatcher" returnType="String"/>
<method name="addEventListener" declaredBy="flash.events::EventDispatcher" returnType="void">
<parameter index="1" type="String" optional="false"/>
<parameter index="2" type="Function" optional="false"/>
<parameter index="3" type="Boolean" optional="true"/>
<parameter index="4" type="int" optional="true"/>
<parameter index="5" type="Boolean" optional="true"/>
</method>
<method name="dispatchEvent" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="flash.events::Event" optional="false"/>
</method>
<method name="hasEventListener" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
<parameter index="1" type="String" optional="false"/>
</method>
</type>


所有的标签与之前 factory 标签中的内容是一样的

现在我们使用 describeType 来遍历之前 Dummy 类中的元素

实例化:

var dummy:Dummy = new Dummy();

获取实例信息:

var instanceInfo:XML = describeType(dummy);

把所有的属性取出来, 包括访问器和变量, 并且访问器不可为只写:

var properties:XMLList = instanceInfo..accessor.(@access != "writeonly") + instanceInfo..variable;

此时 properties 里就有所有的属性名了. 最后我们遍历这个 XMLList

for each (var propertyInfo:XML in properties) {

// 取出属性名
var propertyName:String = propertyInfo.@name;

// 根据属性名来访问
trace(dummy[propertyName]);
}

这样 dummy 就被 "遍历" 出了~

完整代码:

var dummy:Dummy = new Dummy();
var instanceInfo:XML = describeType(dummy);
var properties:XMLList = instanceInfo..accessor.(@access != "writeonly") + instanceInfo..variable;
for each (var propertyInfo:XML in properties) {
var propertyName:String = propertyInfo.@name;
trace(dummy[propertyName]);
}

这样我们可以专门写一个类, 负责获取类信息, 详细见类中注释
TypeDescriptor.as, 负责获取信息

package
{
import flash.utils.describeType;
import flash.utils.getQualifiedClassName;
import flash.utils.getDefinitionByName;

/**
* 使用 flash.utils.describeType 获取类详细信息并缓存
* @author kakera
*
*/
public class TypeDescriptor
{

/**
* 缓存已经反射过了的对象
*/
private static var typeCache:Object = new Object();



/**
* 获取类信息
* @param target 要获取的目标对象
* @return TypeDescriptorEntry 实例
*
*/
public static function describeType (target:*):TypeDescription {

var className:String = getQualifiedClassName(target);

/**
* 检查缓存中是否已经有目标对象项, 如果有就返回缓存中的内容
*/
if (className in typeCache)
return typeCache[className];


/**
* 暂存属性列表
*/
var propertyNames:Array = [];


/**
* 获取类信息, 如果传入的是实例则获取实例类型的类信息
*/
var typeInfo:XML = flash.utils.describeType(target is Class ? target : getDefinitionByName(className) as Class);


/**
* 获取类中所有的属性和访问器
*/
var properties:XMLList = typeInfo.factory..accessor.(@access != "writeonly") + typeInfo..variable;


/**
* 遍历并存放到 propertyNames 中
*/
for each (var propertyInfo:XML in properties)
propertyNames.push(propertyInfo.@name);


/**
* 创建 TypeDescriptorEntry 的实例并把 propertyNames 等属性丢进去
*/
var entry:TypeDescription = new TypeDescription();
entry.name = className;
entry.properties = propertyNames;
entry.typeInfo = typeInfo;


/**
* 缓存到 typeCache 中以便下次从缓存中读取
*/
typeCache[className] = entry;

return entry;
}

/**
* 静态类无须实例化
* @return
*
*/
public function TypeDescriptor () { }
}
}

TypeDescription.as, 负责保存信息

package
{

public class TypeDescription
{

/**
* 类的属性列表, 包括访问器 (accessor) 和变量 (variable)
*/
public var properties:Array; /* of String */


/**
* 类名
*/
public var name:String;



/**
* 由 flash.utils.describeType() 获取的原始 XML 数据
*/
public var typeInfo:XML;


public function TypeDescription () { }
}
}

下载文件 点击下载教程及源码
 
PlatformIO串口监视器波特率配置实战:从乱码到清晰输出的关键步骤 本文针对PlatformIO串口监视器常见的乱码问题,深入解析了其根源在于波特率不匹配。文章核心在于指导开发者通过修改项目根目录下的platformio.ini配置文件,正确设置monitor_speed参数,确保与代码中Serial.begin()的波特率一致,从而实现从乱码到清晰输出的关键步骤。此外,还介绍了其他实用的串口监控配置与常见避坑指南。 阅读详情

相关推荐

NFC门禁卡复制全解析:从M1卡到UID卡的攻防实践

本文深入解析了NFC门禁卡的安全机制与攻防实践。从M1卡基于Crypto1算法的原理漏洞讲起,详细阐述了利用Proxmark3等工具进行侦听、破解密钥及使用UID卡进行复制的完整攻击链条。同时,为防御方提供了从升级CPU卡、启用全扇区认证到部署多因子验证的系统性防护策略,旨在帮助管理员构建更稳固的物理安全防线。

weixin_29182481的博客 1401

AS3解疑:三种 for 循环的效率

AS3 提供了三种循环 for、forin、foreachin,这里测试一下三种方式的效率问题。 测试数据是一个 1000W 字符串的 Array,循环 push 到新的 Array 中。唯一不同的就是for的方式。为了防止GC造成的影响,每次输出后都会强制GC一次。 ================================================ for (var i ...

小白·菜 720

5分钟搞懂语义通信:如何用深度学习让AI理解你的真实意图?

本文深入解析了语义通信如何利用深度学习技术,实现从传统‘比特保真’到‘语义保真’的范式转移。通过介绍基于神经网络的端到端系统架构、编解码技术及实战案例,阐明AI如何理解并高效传递信息核心意图,为6G时代的人机交互奠定基础。

weixin_29191669的博客 263

浅谈AS3 中的for,for in ,for each in的效率问题

新的 for each … in 除了遍历XML,同样可以用来遍历数组和对象。创建“百万雄兵”:以前的 for 和 for … in 以及新的 for each … in 循环: ...

chongfeng4470的博客 242

QGIS编译(跨平台编译)之五十六:QScintilla编译、QScintilla安装(Windows、Linux、MacOS环境下编译、安装)

QGIS编译;QScintilla编译、QScintilla安装(Windows、Linux、MacOS环境下编译、安装)

LuckyHanMo的博客 1897

【OpenFOAM】-olaFlow-算例1- baseWaveFlume

算例文件注释--olaFlow-算例1- baseWaveFlume

ou_no的博客 3639

as3中for..in 语句和for each..in 语句

for ..in 语句 遍历 对象的动态属性或数组中的元素,并对每个属性或元素执行 statement 。对象属性不按任何特定的顺序保存,因此属性看似以随机的顺序出现。固定属性,例如在类中定义的变量和方法,不能由 for..in 语 句来枚举。若要获得固定属性列表,请使用 flash.utils 包中的 describeType()  函数。下面的示例使用  for..in  遍历对

万里浮云的专栏 2657

AXI2APB_bridge 设计

此处研究AHB Slave到 APB master的桥接器,实现接口转化,例如下图之后是参数描述

Starry__的博客 4036

as3中for in 和 for each in的区别

    与for...in循环不同的是,for each...in循环中的迭代变量包含属性所保存的值,而不包含属性的名称(或主键,索引). 例如:  1 var myObj:Object = {x:20, y:30};  2 for (var i:String in myObj) {  3     trace (i + ": " + myObj[i]);  4 }  5 // output...

SpallationMetamorph的专栏 248

手把手教您国内安装 Claude Code 并配置自定义大模型(包含New-API中转和可视化管理工具的使用)

国内免魔法畅用 Claude Code!手把手教你 Windows 安装、配置文件写法、对接阿里百炼 / DeepSeek / 智谱✨,附完整参数、正确命令、三方工具管理方案,新手一次成功!✅

XiaoqiangClub的博客 3782

docker容器ubuntu:latest里使用uv add mysqlclient安装失败的解决方案

在Docker容器(ubuntu:latest)中安装mysqlclient失败,原因是缺少必要的依赖包。错误显示系统找不到pkg-config工具和MySQL客户端库。解决方法:先更新软件源并安装构建工具、Python开发包、MySQL客户端库和pkg-config工具。具体步骤:运行sudo apt update,然后安装build-essential python3-dev default-libmysqlclient-dev pkg-config,最后再执行uv add mysqlclient即可成

拥抱具身智能,昇腾Ascend C 294

as3备忘八-杂:类型转换、字面值、常量、运算符、语句(for in和for each in)

先说一下数据类型: 基元数据类型包括 Boolean、int、Null、Number、String、uint 和 void。ActionScript核心类还定义下列复杂数据类型:Object、Array、Date、Error、Function、RegExp、XML 和 XMLList。   1、类型转换就是将一个对象的类型转换成另外的一种类型(它有资格转换,如果没有就会出错)。 2、什么时候...

kino 260

Matlab之App Designer 一键自动生成带有表格的报告

本文采用案例讲解的方式介绍了采用Matlab中的App Designer开发可视化GUI分析界面后,实现一键自动导出带有表格报告的方法和步骤。可以实现从报告编制等繁琐的工作中解脱出来。

m0_59012156的博客 355

flash as3 殿堂之路连载2

 3.4.5 for...in和for each...infor(var 枚举变量 in 枚举集合) //枚举变量返回为集合元素键名for each(var 枚举变量 in 枚举集合) //枚举变量返回为集合元素值3.4.7 break和continue标签的特殊用法在循环语句前用 标签: 的形式为循环体赋标签,然后就可以在break和continue语句后 加上空格+这个标签,实现控制对应循环的

dohyun的FLASH 570

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

as3遍历对象所有属性的方法

as3遍历对象所有属性的方法(包含Flex) 1、所有对象,包括静态属性和动态属性 ObjectUtil.getClassInfo(this._arr[0]).properties as Array 2、仅能遍历静态属性 var o:Object=new Object(); o.name='mm'; o.type='size'; o.size='32D'; for (var

万里浮云的专栏 9620

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

binding in as3

http://www.sandy1219.cn/flash/as3_binding.rar

的博客 651

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

as3关闭html页面,How to Display HTML in Flash AS3

2 Select ActionsSelect "Actions" from the "Window" menu on the main Flash menu bar to open the ActionScript 3 editor.Position your mouse cursor on the first line of the ActionScript 3 editor. Click yo...

weixin_36212050的博客 135

Flash AS3.0显示列表与Starling GPU渲染性能对比实战测试

在图形渲染领域,CPU与GPU的架构差异决定了性能表现的根本不同。CPU渲染(如传统显示列表)依赖单核顺序计算,而GPU渲染则利用并行处理能力,能高效处理海量顶点与纹理数据。这种硬件加速技术为2D图形渲染带来了革命性的性能提升,尤其适用于需要高帧率、大量精灵动画的游戏与数据可视化场景。本文通过一个具体的“同屏最大动画数量PK”测试,直观对比了Flash AS3.0传统显示列表与Starling GPU加速引擎的性能差异,揭示了在应对数千个动态对象时,GPU渲染如何实现性能的飞跃,为面临性能瓶颈的Flash/

weixin_30614109的博客 404

Flash.ActionScript3.殿堂之路 笔记 2 [ActionScript3 typeof is as in delete]

typeof { 用字符串返回对象的类型  用法: typeof(int) 常用返回类型: Array   object Boolean  boolean Function  function int   number Number  number object   object String   string uint   number XML   xml XMLList  xml}is{ 

小白&1987 's ZONE 1089

AS3的png图片编码器

关于AS3的png图片编码器:代码如下: /* Adobe Systems Incorporated(r) Source Code License Agreement Copyright(c) 2005 Adobe Systems Incorporated. All rights reserved. ...

304

Google三款新AI模型解析:3.6 Flash、Flash-Lite与Flash Cyber实战指南

大语言模型作为人工智能的核心技术,通过Transformer架构实现文本理解与生成。其原理基于注意力机制处理序列数据,在自然语言处理领域展现出强大能力。技术价值体现在降低开发门槛、提升生产效率,广泛应用于智能客服、内容生成等场景。Google最新发布的3.6 Flash、3.5 Flash-Lite和3.5 Flash Cyber三款模型,针对不同应用需求进行优化:Flash平衡性能与成本,适合通用AI应用;Flash-Lite专注轻量级快速响应,适用于移动端和边缘计算;Flash Cyber增强安全特性,

weixin_34007020的博客 370

Flash/AS3与C++通过socket通信

c++部分///main.cpp#include iostream>  ///加载需要的头文件 关于输入输出#include winsock2.h> ///socket套接字头文件using namespace std; ///使std命名空间全部展开不用每次在写std::前缀了WSADATA wsaData;//WSADATA 是一个结构 说明需要装载的dll的版本相关信息SOCKET

ufodsyfaa的专栏 1115

AS3中的循环

package cycle { import flash.display.Sprite; public class CycleTest extends Sprite { public function CycleTest() { super(); // for_cycle(); // for_in_cycle(); // for_each_in_cycle();

陈小晨的专栏 1069

Tags support in htmlText flash as3

Tags support in htmlText flash as3 1. anchor tag <a> </a> Three attributes are supported: 1.1 href:URL can be relativl or absolute. Notice: the absolute URL must begin with “htt...

79

列出对像属性,for(var i in obj)[转]

function listProperties(obj, objName) {     var result = "";     for (var i in obj) {         result += objName + "." + i + "=" + obj[i] + "\n";     }     alert(result);

牧灵 1886

Google AI新模型解析:3.6 Flash、3.5 Flash-Lite与3.5 Flash Cyber实战指南

AI模型作为人工智能技术的核心组件,通过深度学习架构实现智能推理与内容生成。其原理基于Transformer等神经网络结构,通过大规模数据训练获得语义理解能力。在技术价值层面,AI模型显著提升了自动化处理效率,降低了人工干预需求。应用场景广泛覆盖智能客服、内容创作、移动应用集成等领域。本文聚焦Google最新发布的3.6 Flash、3.5 Flash-Lite和3.5 Flash Cyber三款模型,针对性能优化和轻量化设计等热词展开深度解析,提供从环境配置到智能客服系统集成的完整实战方案,帮助开发者掌握

weixin_33681778的博客 413
上一篇: 读取XML当中的HTML标签读取XML当中的HTML标签
下一篇: 手机 : 音乐格式详介
wx红杉树
博客等级 码龄21年 383粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值