背景:
从是否可以区分仅存在于编译阶段为实例动态添加属性,可以类分为:动态类(Dynamic Class)和密封类(Sealed Class)。动态类生成的实例可以在运行时动态添加属性,而密封类则不可以,for..in与for each ... in只能遍历动态类的动态属性。
例子:
1、DynamicClass
package com.test { public dynamic class DynamicClass { private var _name:String; private var _type:String; public static const DYNAMICTYPE:String="dynamictype"; public function DynamicClass() { } public function get name():String { return _name; } public function set name(value:String):void { _name = value; } public function get type():String { return _type; } public function set type(value:String):void { _type = value; } } }
2、SealedClasspackage com.test { public class SealedClass { private var _name:String; private var _type:String; public static const SEALEDTYPE:String="sealedtype"; public function SealedClass() { } public function get name():String { return _name; } public function set name(value:String):void { _name = value; } public function get type():String { return _type; } public function set type(value:String):void { _type = value; } } }
3、Application<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <fx:Script> <![CDATA[ import com.test.DynamicClass; import com.test.SealedClass; protected function dybtn_clickHandler(event:MouseEvent):void { var dy:DynamicClass=new DynamicClass(); dy.name="DynamicClass"; dy.type=DynamicClass.DYNAMICTYPE; dy.namespace="com.test.DynamicClass"; dy.func=function():String{return "DynamicClass Function!";}; for( var o:Object in dy) { trace(o+":"+dy[o]); } } protected function slbtn_clickHandler(event:MouseEvent):void { var sl:SealedClass=new SealedClass(); sl.name="SealedClass"; sl.type=SealedClass.SEALEDTYPE; //sl.namespace="com.test.SealedClass"; //sl.func=function():String{return "SealedClass Function!";}; for( var o:Object in sl) { trace(o+":"+sl[o]); } } ]]> </fx:Script> <s:VGroup> <s:Button label="动态类" click="dybtn_clickHandler(event)"/> <s:Button label="密封类" click="slbtn_clickHandler(event)"/> </s:VGroup> </s:Application>
运行:
注意:
1、因为SealedClass是不是动态,不能动态添加属性,所以必须注释掉,否则报错。
//sl.namespace="com.test.SealedClass"; //sl.func=function():String{return "SealedClass Function!";};
2、本例子说明了,for..in 与for each ... in只能遍历动态类的动态属性。