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()。

如果你顯示一個完整的例子,駁斥我說的話,我會運行它並刪除我的帖子,但我很確定我就在這裏。

相關問題