當其經由.addChild()
或.addChildAt()
加入另一DisplayObjectContainer
一個DisplayObject
的parent
屬性獲取設置。這些調用由Flash UI隱式創建,以將子項添加到可見對象。
所以,你在做什麼有一些問題,有些是關於DisplayObjects
在flash中工作的誤解,還有一些是語法問題。
當你調用new Child()
,要調用的Child
類的構造函數,你的情況:
public function Child()
{
trace([parent as MovieClip].i);
}
在這一點上,它具有沒有增加了作爲一個孩子的DisplayObjectContainer
。在父類中簡單命名爲child
不會創建這種關係。所以在這種情況下,您的構造函數中this.parent
總是支持null,因爲它只是創造了Child
類的新實例,它沒有任何「父」
這裏有一個相當大的語法問題的知識,以及。您正在扮演as
演員(如果類型不兼容,將返回null
)。然而,在這種情況下,parent
已經是null
,但後來您使用的是[]
,這是寫入文字Array
的方式。所以你本質上是創造一個新的Array
與一個元素是null
。然後你試圖在Array
而不是父母身上獲得名爲i
的房產。
顯然,這不是你想要做的......完全可以。你大概意思是這樣的:
public function Child()
{
trace((parent as MovieClip).i);
}
但是,即使這是不對的,因爲i
不是屬性上MovieClip
,它對你的Main
子類的屬性。所以,你真的大概意思:
public function Child()
{
trace((parent as Main).i);
}
但是,這仍然會失敗,因爲就像我以前說過,parent == null
因爲它沒有被添加作爲一個孩子呢。
考慮下面的代碼:
public class Main extends MovieClip
{
public var i;
public var child:Child;
public function Main()
{
i = 4;
child = new Child();
child.doWork();
this.addChild(child)
child.doWork();
}
}
和:
public class Child extends MovieClip
{
public function Child()
{
doWork();
}
public function doWork()
{
if(parent == null) {
trace("No parent yet.")
return;
}
var mainParent:Main = (parent as Main);
if(mainParent == null) {
trace("Parent isn't a instance of Main!")
return;
}
trace(mainParent.i);
}
}
這應該調用的方法doWork()
三次:一次在孩子的構造函數,然後被添加到顯示樹之前,和最終被添加到顯示樹後。希望它會更有意義,看到它像這樣工作。
還有很多東西需要學習,特別是關於事件,事件冒泡以及DisplayObjects
和DisplayObjectContainers
如何相關/嵌套。但也許這會給你一個正確的方向。只要知道parent
只是DisplayObject
(MovieClip
和Flash中許多其他類的祖先之一)的屬性。瞭解這些類如何相互協作,並用自己的功能擴展它們,這對於真正理解Flash來說至關重要。
哇,謝謝你的令人難以置信的全面回覆,32bitkid。我最近開始學習as3,並在C語言中有過一些經驗 - 我在時間軸上的第一個關鍵幀中編寫的代碼通常做了我想做的事情。然而今天,我想我會試着弄清楚如何使用extenal .as文件並將它們分開,但這是一個徹底的失敗(直到你回覆)。所以再次感謝你花時間寫出了一個很棒的答案,你已經度過了我的一天! – xdl