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; 
} 
+1

你能发布一些代码,显示你的意思吗? –

+0

添加了快速示例 –

+0

我猜你在同一个类中都有两个代码块。试试这个,你会意识到,创建一个名为'GetSprite'的新类没有任何代码在它的构造函数中,然后有一个函数'getSprite'并从另一个类访问'getSprite'函数,那么你就会理解这个悖论在你的问题。 – Moorthy

回答

3

据我了解,这很好(如果不是非常好的,可读的)。有什么新的被调用时发生的情况是:

  1. 内存分配的实例(this变得可用)
  2. 所有成员被初始化(或者为它们的默认或任何指定)
  3. 调用构造函数
  4. new回报this

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

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 

但是在第二种情况下,你不能从静态方法中引用“这个”关键词的createInstance()。

如果你显示一个完整的例子,驳斥我说的话,我会运行它并删除我的帖子,但我很确定我就在这里。

相关问题