我可以从AS3创建一个类的实例,只知道它的名字吗?我的意思是字符串表示,如FlagFrance
答案 0 :(得分:24)
按名称动态创建类的实例。为此,可以使用以下代码:
//cc() is called upon creationComplete
private var forCompiler:FlagFrance; //REQUIRED! (but otherwise not used)
private function cc():void
{
var obj:Object = createInstance("flash.display.Sprite");
}
public function createInstance(className:String):Object
{
var myClass:Class = getDefinitionByName(className) as Class;
var instance:Object = new myClass();
return instance;
}
getDefinitionByName的文档说:
"Returns a reference to the class object of the class specified by the name parameter."
上面的代码我们需要将返回值指定为Class?这是因为getDefinitionByName还可以返回一个Function(例如flash.utils.getTimer
- 一个不在任何类中的包级别函数)。由于返回类型可以是Function或Class,因此Flex团队将返回类型指定为Object,并且您需要根据需要执行强制转换。
上面的代码非常模仿文档中给出的示例,但在某种程度上它是一个不好的例子,因为一切都适用于flash.display.Sprite
,但尝试用自定义类做同样的事情,你会可能最终会出现以下错误:
ReferenceError: Error #1065: Variable [name of your class] is not defined.
错误的原因是您必须在代码中引用您的课程 - 例如你需要创建一个变量并指定它的类型如下:
private var forCompiler:SomeClass;
如果不这样做,您的类将不会在编译时编译到.swf中。编译器只包含实际使用的类(而不仅仅是导入的类)。它这样做是为了优化.swf的大小。所以声明一个变量的需要不应该被认为是一个疏忽或错误,尽管声明一个你不直接使用的变量确实感到愚蠢。
答案 1 :(得分:7)
是的,请使用getDefinitionByName
:
import flash.utils.getDefinitionByName;
var FlagFranceClass:Class = getDefinitionByName("FlagFrance");
var o:* = new FlagFranceClass();