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;
}
虽然我希望静态函数是虚拟的,但它们可以做他们应该做的事情。
元数据对类级项的静态函数有什么优势?
答案 0 :(得分:3)
我认为存在与使用元数据相关的一些性能问题。 describeType
并不便宜,那么你必须从大型XML树中提取你想要的东西。
肯定存在与类型相关的问题。如果数据在一个类中,即使你发送Object
的第二个例子也会好得多。这些天我很少非常在我的代码中的任何地方使用Object
,除非我正在进行原型设计。而且您的代码可以更加简洁:
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为此目的使用它们(例如构建远程对象,事件,可绑定的列表)但我会从不推荐它们正常使用。
答案 1 :(得分:3)
我更赞同詹姆斯。但是,元数据有一个优势:统一访问 ...
如果你有一个类数组,并且你知道它们每个都有一个属性classMetaData
,那么这段代码将不起作用:
for each (var c:Class in arrayOfClass)
trace(c.getData());
这将:
for each (var c:* in arrayOfClass)
trace(c.getData());
但它相当古怪,要求每个类都有该静态属性,并且c.getData()
之上的类型也是*
...
通过describeType
访问元数据总是很好......可能发生的最糟糕的事情是,你最终迭代一个空的XMLList
,但最终却没有错...如果你将遍历封装到某个实用程序类或类似的东西中,那么你最终得到了一个可靠的解决方案...如果它使用缓存来检索数据,那么你实际上并不比使用静态变量访问慢......
最后,我认为这个想法很简单:你应该使用元数据标签捕获元数据和动作脚本以捕获数据 ......这种区别不是100%显而易见,而是最后,由你来划分两者之间的界线...
格尔茨
back2dos