只要知道它的名字,我可以从AS3创建一个类的实例吗?我的意思是字符串表示,就像FlagFrance
Swa*_*ngh 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;
}
Run Code Online (Sandbox Code Playgroud)
getDefinitionByName的文档说:
"Returns a reference to the class object of the class specified by the name parameter."
Run Code Online (Sandbox Code Playgroud)
上面的代码我们需要将返回值指定为Class?这是因为getDefinitionByName也可以返回一个Function(例如flash.utils.getTimer- 一个不在任何类中的包级别函数).由于返回类型可以是Function或Class,因此Flex团队将返回类型指定为Object,并且您需要根据需要执行转换.
上面的代码非常类似于文档中给出的示例,但在某种程度上它是一个糟糕的例子,因为一切都可以正常工作flash.display.Sprite,但尝试用自定义类做同样的事情,你可能会得到以下错误:
ReferenceError: Error #1065: Variable [name of your class] is not defined.
Run Code Online (Sandbox Code Playgroud)
出错的原因是您必须在代码中引用类 - 例如,您需要创建一个变量并指定它的类型如下:
private var forCompiler:SomeClass;
Run Code Online (Sandbox Code Playgroud)
如果不这样做,您的类将不会在编译时编译到.swf中.编译器只包含实际使用的类(而不仅仅是导入的类).它这样做是为了优化.swf的大小.所以声明一个变量的需要不应该被认为是一个疏忽或错误,尽管声明一个你不直接使用的变量确实感到hackish.
是的,使用getDefinitionByName:
import flash.utils.getDefinitionByName;
var FlagFranceClass:Class = getDefinitionByName("FlagFrance");
var o:* = new FlagFranceClass();
Run Code Online (Sandbox Code Playgroud)