0

在 AS3 中,您可以通过调用成员函数来初始化成员变量(或常量)。这发生在调用构造函数之前。与此同时,'this'关键字在初始化成员函数中是完全可访问的,即使尚未发出构造函数。

这听起来像是一颗定时炸弹。任何人都可以评论上述做法吗?

编辑 :

...
private var member:Sprite = getSprite(); // called before constructor
...
private function getSprite():Sprite {
    var spr:Sprite = new Sprite();
    this.addChild(spr); // 'this' used before constructor
    return spr;
}
4

2 回答 2

3

据我了解,这很好(如果不是真的很好和可读)。调用 new 时会发生什么:

  1. 为实例分配内存(this变为可用)
  2. 所有成员都被初始化(无论是默认值还是指定的)
  3. 构造函数被调用
  4. new返回this

危险在于你必须确保没有任何getSprite()东西需要在构造函数中初始化的东西(包括父构造函数,如果它被调用)。我会避免它,而只是初始化构造函数中的所有内容。

于 2012-10-07T21:41:12.733 回答
0

你真的不能按照你说的去做。如果尚未构造实例,您可能无法访问实例上的非静态方法。至于 Jonatan 关于调用 super 的构造函数的评论,如果您不在构造函数主体中调用 super(),它会自动出现在方法的顶部,这是隐式完成的。当您在面向对象的语言中构造一个对象时,您正在为该类的所有成员分配内存。

如果你说:

var myVar:MyObject;
myVar.doSomething(); //this line creates a null pointer exception because myVar is null

相反,如果您要说:

var myVar:MyObject = MyObject.createInstance(); // assuming createInstance is a static method that returns an instance of MyObject
myVar.doSomething(); //assuming createInstance() didn't return null then this works

But in this second case you can't reference "this" keyword from within the static method createInstance().

If you show a full example that refutes what I'm stating then I'll run it and delete my post, but I'm pretty sure I'm right here.

于 2012-10-08T02:36:37.787 回答