请尊重别人写的东西,如果想转载该文章请注明版权sunbright博客 http://www.xiaos8.com
 
上次已经讲过了getDefinitionByName,getQualifiedClassName,getQualifiedSuperclassName三个偏门函数
这次我们来讲另外一个偏门函数:describeType
首先我们来看看ADOBE的话
下面引用帮助文档中的原话
生成描述 ActionScript 对象(命名为方法的参数)的 XML 对象。 此方法实现 ActionScript 语言的反射编程概念
看完后,大家比较关注的应该是反射编程是什么意思?
以下引用某一段教材
使用反射编程(reflective programming),可以使你的程序在运行时通过自省(introspection)运行需求,使用具体化(reification)能力自己调解(intercession)自己(通俗地说,就是运行时自动修改程序),动态获得新的行为能力。具有反射能力的语言或应用,能够把对程序部分功能的定义延缓到运行时确定,也就是让最终用户定制应用程序,这种特性使程序具有了某种生命,使程序的自我演化成为可能。
其实看完反射编程的描述,然后切合ADOBE提供的函数,说实现了反射编程概念。。我始终没有联系起来两者的关系,但可以确定一点的是,通过这个函数的确可以让我们在写程序的时候,直接通过代码本身就去对类结构进行分析,来形成自我反射,但只是概念性的,因为该函数提供的功能还远远达不到这个级别,废话了这么基础知识,接下来讲讲怎么使用这个函数了
 
函数的作用呢,就是把一个类的各种情况,通过XML的形式展现出来,比如这个类是动态类,或者密封类,或者能否扩展,父类是谁,爷爷类是谁,甚至更高的前辈是谁,有多少公开方法,有多少公开属性,有多少静态属性等等,全部使用XML展示出来。。。听起来似乎很神奇,很悬,那么我们来看具体例子,会理解的更快一点。
trace(describeType(DisplayObject));
/*
输出:
<type name="flash.display::DisplayObject" 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::DisplayObject">
  <metadata name="Event">
   <arg key="name" value="render"/>
   <arg key="type" value="flash.events.Event"/>
  </metadata>
  <metadata name="Event">
   <arg key="name" value="removedFromStage"/>
   <arg key="type" value="flash.events.Event"/>
  </metadata>
  <metadata name="Event">
   <arg key="name" value="removed"/>
   <arg key="type" value="flash.events.Event"/>
  </metadata>
  <metadata name="Event">
   <arg key="name" value="enterFrame"/>
   <arg key="type" value="flash.events.Event"/>
  </metadata>
  <metadata name="Event">
   <arg key="name" value="deactivate"/>
   <arg key="type" value="flash.events.Event"/>
  </metadata>
  <metadata name="Event">
   <arg key="name" value="addedToStage"/>
   <arg key="type" value="flash.events.Event"/>
  </metadata>
  <metadata name="Event">
   <arg key="name" value="added"/>
   <arg key="type" value="flash.events.Event"/>
  </metadata>
  <metadata name="Event">
   <arg key="name" value="activate"/>
   <arg key="type" value="flash.events.Event"/>
  </metadata>
  <extendsClass type="flash.events::EventDispatcher"/>
  <extendsClass type="Object"/>
  <implementsInterface type="flash.events::IEventDispatcher"/>
  <implementsInterface type="flash.display::IBitmapDrawable"/>
  <accessor name="x" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
  <accessor name="y" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
  <accessor name="blendMode" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
  <accessor name="scale9Grid" access="readwrite" type="flash.geom::Rectangle" declaredBy="flash.display::DisplayObject"/>
  <accessor name="alpha" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
  <accessor name="name" access="readwrite" type="String" declaredBy="flash.display::DisplayObject"/>
  <accessor name="rotation" access="readwrite" type="Number" 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"/>
  <accessor name="accessibilityProperties" access="readwrite" type="flash.accessibility::AccessibilityProperties" 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>
  <accessor name="scaleX" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
  <accessor name="visible" access="readwrite" type="Boolean" declaredBy="flash.display::DisplayObject"/>
  <method name="getBounds" declaredBy="flash.display::DisplayObject" returnType="flash.geom::Rectangle">
   <parameter index="1" type="flash.display::DisplayObject" optional="false"/>
  </method>
  <accessor name="width" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
  <accessor name="opaqueBackground" access="readwrite" type="Object" 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="height" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
  <accessor name="scaleY" access="readwrite" type="Number" declaredBy="flash.display::DisplayObject"/>
  <accessor name="mouseX" access="readonly" type="Number" declaredBy="flash.display::DisplayObject"/>
  <accessor name="mask" access="readwrite" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
  <accessor name="parent" access="readonly" type="flash.display::DisplayObjectContainer" 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="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="root" access="readonly" type="flash.display::DisplayObject" declaredBy="flash.display::DisplayObject"/>
  <accessor name="stage" access="readonly" type="flash.display::Stage" declaredBy="flash.display::DisplayObject"/>
  <method name="hitTestObject" declaredBy="flash.display::DisplayObject" returnType="Boolean">
   <parameter index="1" type="flash.display::DisplayObject" optional="false"/>
  </method>
  <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"/>
  <method name="hasEventListener" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
   <parameter index="1" type="String" optional="false"/>
  </method>
  <method name="toString" declaredBy="flash.events::EventDispatcher" returnType="String"/>
  <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="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>
 </factory>
</type>
*/
就这么一小段,理解输出这么多XML信息,我们仔细来研究一下这个xml
其实你发现
<type name="flash.display::DisplayObject" base="Class" isDynamic="true" isFinal="true" isStatic="true">
这一段表示了这个类叫什么名字,路径是什么,是否是动态类,是否是不可扩展类等等
<method name="dispatchEvent" declaredBy="flash.events::EventDispatcher" returnType="Boolean">
 <parameter index="1" type="flash.events::Event" optional="false"/>
</method>
这一段表示了这个类含有方法dispatchEvent,继承的flash.events::EventDispatcher,返回数据的类型为Boolean
他共有一个参数,参数类型是flash.events::Event,是必须的参数
<implementsInterface type="flash.events::IEventDispatcher"/>
<implementsInterface type="flash.display::IBitmapDrawable"/>
这两段表示了他实现了这两个接口
<extendsClass type="flash.events::EventDispatcher"/>
<extendsClass type="Object"/>
这两段表示了他继承了谁,他继承的类又继承了谁,直到Object始祖,才没有了。。
………………………………
后面就不列出来了,自己看这个把:
adobe提供的帮助文档
标签 属性 Description
<type> XML 对象的根标签。
name ActionScript 对象的数据类型的名称。
base ActionScript 对象的定义类的直接超类。 如果 ActionScript 对象是类对象,则值为 Class。
isDynamic 如果 ActionScript 对象的定义类是动态的,则为 true;否则为 false。 如果 ActionScript 对象是类对象,则值为 true,因为 Class 类是动态的。
isFinal 如果 ActionScript 对象的定义类是最终类,则为 true;否则为 false。
isStatic 如果 ActionScript 对象是类对象或构造函数,则为 true;否则为 false。 此属性之所以名为 isStatic,原因是:如果此属性为 true,则未嵌套在 factory 标记内的任何标签都是静态的。
<extendsClass> ActionScript 对象的定义类的每个超类都有一个单独的 extendsClass 标签。
type ActionScript 对象的定义类扩展的超类的名称。
<implementsInterface> ActionScript 对象的定义类或其任何超类实现的每个接口都有一个单独的 implementsInterface 标签。
type ActionScript 对象的定义类实现的接口的名称。
<accessor> 存取器是 getter 和 setter 函数定义的一个属性。
name 存取器的名称。
access 属性的访问权限。 可能的值包括 readonly、writeonly 和 readwrite。
type 属性的数据类型。
declaredBy 包含关联的 getter 或 setter 函数的类。
<constant> 常量是用 const 语句定义的一个属性。
name 常量的名称。
type 常量的数据类型。
<method> 方法是作为类定义的一部分声明的函数。
name 方法的名称。
declaredBy 包含方法定义的类。
returnType 方法的返回值的数据类型。
<parameter> 方法定义的每个参数都有一个单独的 parameter 标签。 此标签始终嵌套在 <method> 标签内。
index 一个数字,对应于参数在方法的参数列表中出现的顺序。 第一个参数的值为 1。
type 参数的数据类型。
optional 如果参数是可选参数,则为 true;否则为 false。
<variable> 变量是用 var 语句定义的一个属性。
name 变量的名称。
type 变量的数据类型。
<factory> 如果 ActionScript 对象是类对象或构造函数,则所有实例属性和方法均嵌套在此标签内。 如果 <type> 标签的 isStatic 属性为 true,则未嵌套在 <factory> 标签内的所有属性和方法都是静态的。 只有在 ActionScript 对象是类对象或构造函数时,此标签才会出现。
明白了吗?帮助文档列出来的这些节点,也不是全部,还有个几个节点没有解释是什么意思。。。
<metadata name="Event">
 <arg key="name" value="removedFromStage"/>
 <arg key="type" value="flash.events.Event"/>
</metadata>
这个肯定是表明事件,但还有几个没有弄明白表示的什么,大家可以提提。。。
 
另外课题:
1、大家可以去用这个输出TextField看看,有几个方法,adobe并没有在帮助文档中公开,应该还有相当一部分的类有些公开的方法或属性都未公开
2、留个题目给大家,这也是腾讯曾经招flasher的一道面试题
腾讯题目
请输出stage的所有属性和所有方法
[最后修改由 sunbright, 于 2008-08-16 00:18:30]
评论Feed 评论Feed: http://www.xiaos8.com/feed.asp?q=comment&id=251
怎么一页才显示这么点文章?点快速检索查看更多的文章: 显示全部 | 评论: 2 | 排序 | 观看的: 3576
weilaixu
[ 2008-08-16 09:01:09 ]
很吃力,看不大懂!
sunbright
[ 2008-08-16 09:05:18 ]
在flash中做做实验,就明白了,我研究一个午休时间。。
另外仔细看一下,相信大概意思还是能明白的

发表
表情图标
[表情01] [表情02] [表情03] [表情04] [表情05] [表情06] [表情07] [表情08] [表情09] [表情10] [表情11] [表情12] [表情13] [表情14] [表情15] [表情16] [表情17] [表情18] [表情19] [表情20] [表情21] [表情22] [表情23] [表情24]
UBB代码
转换链接
表情图标
悄悄话
昵称:   验证码: *
 
快速浏览
类别
标题
评论/流量
日期