MovieClip.addChild()で複数の親にaddChildできない理由
AS3の、DisplayObject.parentとDisplayObjectContainer.addChild()との微妙な関係について、さらっと。
smw
@Shi_MeiWo
AS3のMovieClipは「コンテナ」と認識しがちだけど、実は自分の「子」の情報は持っていない。持っているのは「親(parent)」への参照のみ。包含を作っているのではなく「子から親」への一方通行の参照を、包含に見せかけているだけだ。(続く)
2012-09-07 14:34:32
smw
@Shi_MeiWo
(承前)a.addChild(b)は「aに対しbを組み込むよう命令する」のではなく「bに対してaの参照を割り当てる」…そう、実は「引数」側をいじるメソッドだったのだ! この直後にc.addChild(b)とすると「aの中からbが消える」のも当然。bの参照を書き換えているんだから。
2012-09-07 14:40:34
smw
@Shi_MeiWo
(承前)AS3の強力さと不可解さは、この「子から親への参照を作る=親の中に子を表示」というチグハグさにある。直感的なふりをして、まったく直感的ではないんだからタチが悪い。 でもここが理解できれば、軽やかでスマートなコーディングの一助になるだろう。 (以上)
2012-09-07 14:49:02補足
instanceA.addChild(instanceB);
とすると、instanceB.parentがinstanceAになる。
instanceB.parentは唯一のプロパティ(当たり前だが)なので、この内容が書き換わる=「包含対象が変わる」(というか、FlashPlayerはそのように表示するようにできている)
すなわち、
A.addChild(B)とは、「B.parentへAの参照を渡すsetter」である
というわけ。「包含を変えるにはB.parent=Aと書きましょう」なんてムズカシイ事を言いたくないがためのシンタックスシュガー。
このプロパティがread-onlyであるのも、addChild()との関連を疑われ、いらぬ混乱を生むのを防ぐためだろうなぁ。