ACTIONSCRIPT3.0のプログラミング読んだ、今日のまとめ

p.29~68

クラスやメソッドを名前空間のラベルでグループ化し参照を制御することができる。
public,protectedなどはシステムで予約定義された名前空間のようなものである。メンバをアクセス制御指定子を指定せずに宣言した場合はデフォルトでinternalとなる。

  • スコープ

関数ブロック内で宣言が有効となる。forで宣言された変数もその関数内で有効。以下のような奇妙なコードも可能。

function hoge(){
 trace(fuga); //NaN
 trace(foo); //0
 var fuga:Number = 1;
 var foo:int = 2;

}

これがコンパイルを通るのはホイストという手法でコンパイル時に変数宣言を関数の上位に移動するためらしい。

  • コンンパイルモード別型チェック

standardモードのコンパイルって何なんだろうと思った。型注釈をつけた場合でもランタイムエラーにしかならない。以下のコードはstrictモードはコンパイルエラーとなるけど、standardはならない。

function foo(hoge:Array){
 trace(hoge);
}
foo(2);

オブジェクトに対して関数式によってメソッドを追加した場合に、コンパイルモードにより呼び出し方に制限がある。

var obj = {};
obj.hoge = function (){};
obj.hoge(); //standard ok, strict ng
obj["hoge"](); //standard and strict ok

型判別をするのにis(戻り値Boolean)、as(戻り値Object)演算子を使うこと。

  • ダイナミッククラス

ダイナミッククラスとして宣言しなければ動的にプロパティやメソッドの追加ができない。

ドキュメントに不適切なコード例では?と思うところがあった。(p.41)

しかし、この方法で作成されたメソッドは、Protean クラスのプライベートプロパティまたはメソッドにアクセスできま
せん。また、Protean クラスのパブリックプロパティまたはメソッドへの参照も、this キーワードまたはクラス名のい
ずれかで修飾する必要があります。次の例は、Protean クラスのプライベート変数およびパブリック変数にアクセスしよ
うとする traceProtean() メソッドを示します。
myProtean.traceProtean = function ()
{
trace(myProtean.privateGreeting); // undefined
trace(myProtean.publicGreeting); // hello
};
myProtean.traceProtean();

このコードは

myProtean.traceProtean = function () 
{ 
trace(this.privateGreeting); // undefined 
trace(this.publicGreeting); // hello 
}; 
myProtean.traceProtean(); 

と書くべきでは?

  • undefinedとnull

オブジェクトはの初期値はnullとなる。型注釈をつけていない変数はundefinedとなる。また型が決定されたオブジェクトにundefinedを代入するとそのオブジェクトの初期値が代入される。

  • ...(rest)パラメータ

関数パラメータの指定されていない残りのパラメータを宣言できる。

function foo(a,b,... z){
 for(var i=0;i<z.length;i++){
  trace(z[i]);
 }
}

foo(1,2,3,4,5)

/*
3
4
5
*/

以上、疲れた。こまごまとした疑問や不満が沸々とわいてくる仕様だなと思った。文章の説明の仕方にばらつきが感じられる。また明日続きを読んで書こうと思う。

*注:コード書いてるけど実行して確かめてはいない。