Actionscript 3 自定义元数据和静态函数之间的区别?

Actionscript 3 自定义元数据和静态函数之间的区别?,actionscript-3,Actionscript 3,Actionscript类中的自定义元数据非常酷。您可以将任何内容放在类、函数和变量前面的方括号中;告诉编译器将其(按名称)包含在SWF中;并使用describeType()检索它 [MyMetaData(name1=value1, name2=value2)] 添加到“其他编译器参数” -keep-as3-metadata+=MyMetaData 并使用describeType()查找包含该元数据的项目 var typeDescriptionXML : XML = flash.utils.

Actionscript类中的自定义元数据非常酷。您可以将任何内容放在类、函数和变量前面的方括号中;告诉编译器将其(按名称)包含在SWF中;并使用describeType()检索它

[MyMetaData(name1=value1, name2=value2)]
添加到“其他编译器参数”

-keep-as3-metadata+=MyMetaData
并使用describeType()查找包含该元数据的项目

var typeDescriptionXML : XML = flash.utils.describeType(aType);

var itemsWithMyMetaData : XMLList = 
    classXML.factory.metadata.(@name == "MyMetaData");

另一方面,静态功能相当直接:

public static function myStaticFunction() : Object
{
    var result : Object = new Object({name1: "value1", name2: "value2"});
    return result;
}
虽然我希望静态函数是虚拟的,但它们做了它们应该做的事情



元数据相对于类级项的静态函数有什么优势?

我假设在使用元数据时会出现一些性能问题。
describeType
并不便宜,那么您必须从大型XML树中提取所需内容

当然也存在与类型相关的问题。即使是第二个示例,如果数据在类中,发送
对象
也会更好。现在,我很少在代码中的任何位置使用
对象
s,除非我正在进行原型设计。而且您的代码可以更加简洁:

public static function myStaticFunction():Object
{
    return { name1: "value1", name2: "value2" };
}
此外,静态类函数可以与其他静态类函数和静态属性交互:

package
{
public class StaticClass
{
    private static const SOME_DATA:int = 0;
    private static const SOME_STRING:String = "Hello World";

    private static var count:int = 0;

    public static function printCount():void
    {
        trace(SOME_STRING, SOME_DATA, count++);
    }
}

}

我可以想象元数据的用途(例如,对于不需要实现接口的库代码),我可以理解Flex为什么会使用元数据(例如,构建远程对象、事件、绑定表的列表)但是我永远不会推荐它们用于正常使用。

我更不同意James的观点。然而,元数据有一个优点:统一访问

如果您有一个类数组,并且您知道每个类都有一个属性
classMetaData
,那么此代码将不起作用:

for each (var c:Class in arrayOfClass) 
     trace(c.getData());
这将:

for each (var c:* in arrayOfClass) 
     trace(c.getData());
但它相当奇怪,要求每个类都具有该静态属性,而且在该属性之上,
c.getData()
也是
*
类型

通过
describeType
访问元数据总是很好的…可能发生的最糟糕的事情是,您最终迭代了一个空的
XMLList
,但这并没有什么错…如果您将遍历封装到某个实用程序类或类似的东西中,那么您最终会得到一个可靠的解决方案…一个d如果它使用缓存来检索数据,那么您实际上并不比使用静态变量访问慢

最后,我认为这个想法很简单:您应该使用元数据标签来捕获元数据,使用actionscript来捕获数据。…区别不是100%明显,但最终,这取决于您在两者之间划清界限

格里茨

back2dos