ActionScript言語とシンタックス
ActionScript言語とシンタックス
パッケージと名前空間
パッケージの作成
package samples { public class SampleCode { public var sampleGreeting:String; public function sampleFunction() { trace(sampleGreeting + " from sampleFunction()"); } } }
package直下にはpublicは1ファイルにつき1つのクラス・関数・変数のみ
デフォルトではinternal
パッケージの読み込み
import samples.* var mySample:SampleCode = new SampleCode();
名前空間の定義と適用
public、private、protected、および internal アクセス制御指定子は、ビルトイン名前空間のようなもの
これらのあらかじめ定義されているアクセス制御指定子が要件を満たさない場合は、独自の名前空間を作成することができる
version1 名前空間を定義します。
namespace version1;
myFunction() という関数を version1 名前空間に配置します。
version1 function myFunction() {}
名前空間を適用したら、use ディレクティブを使用するか、名前空間で識別子の名前を修飾して、名前空間を参照できます。
次の例では、use ディレクティブから myFunction() 関数を参照します。
use namespace version1; myFunction();
次の例に示すように、修飾名を使用して myFunction() 関数を参照することもできます。
version1::myFunction();
URI を使用して名前空間を定義する方法
URI を省略した場合、コンパイラは URI の代わりに一意の内部 ID ストリングを作成します
namespace flash_proxy = “http://www.adobe.com/flash/proxy”;
名前空間はpublicにしないとそのパッケージまたはクラスの外部にあるコードに対して表示されません
package flash.utils { public namespace flash_proxy; }
次のようにするとmyFunction()は名前空間example1に属するようになる
namespace example1; class someClass { example1 myFunction() {} }
use namespace ディレクティブで名前空間を参照できます。また、名前修飾子 (::) を使用して名前空間で名前を修飾できます。
use namespace で名前空間を開くと、名前空間はそれ自体が開かれたコードブロック全体で開かれたままになります。
メソッドまたはプロパティの名前を名前空間と名前修飾子(::)で修飾すると、use namespaceディレクティブを使用する必要はありません。
変数
宣言&初期化
var i:int = 10; var numArray:Array = ["zero", "one", "two"]; var customItem:CustomClass = new CustomClass(); var a:int, b:int, c:int;
スコープ
ローカル変数を定義できるコードの最小範囲が関数定義です。ActionScript の変数にはブロックレベルのスコープはありません。
コードブロックは、左中括弧 ({) と右中括弧 (}) で囲まれたステートメントのグループです
デフォルト値
Boolean | false |
int | "0" |
Number | NaN |
Object | null |
String | null |
uint | "0" |
宣言されていない ( 型注釈 * と同じ) | undefined |
ユーザー定義クラスを含むその他すべてのクラス | null |
データ型
is演算子
変数または式が特定のデータ型のメンバーであるかどうかをテストすることができます
var mySprite:Sprite = new Sprite(); trace(mySprite is Sprite); // true mySprite は Sprite クラスのインスタンスである trace(mySprite is DisplayObject); // true mySprite は DisplayObject クラスのインスタンスである trace(mySprite is IEventDispatcher); // true mySprite は IEventDispatcher インターフェイスを実装している
as 演算子
式が指定されたデータ型のメンバーであるかどうかをチェックすることができます。
しかし、is 演算子とは異なり、as 演算子はブール値を返しません。
as 演算子は、true の代わりに式の値、false の代わりに null を返します。
var mySprite:Sprite = new Sprite(); trace(mySprite as Sprite); // [ オブジェクト Sprite] trace(mySprite as DisplayObject); // [ オブジェクト Sprite] trace(mySprite as IEventDispatcher); // [ オブジェクト Sprite] trace(mySprite as Number); // null
as 演算子を使用する場合、右側のオペランドはデータ型である必要があります
ダイナミッククラス
プロパティおよびメソッドを追加したり変更したりすることで実行時に変更可能なオブジェクトを定義します。String クラスなどの動的ではないクラスは、"sealed" クラスです。
実行時に、sealed クラスにプロパティまたはメソッドを追加することはできません。
次のコードは Protean という名前のダイナミッククラスを作成します。
dynamic class Protean { private var privateGreeting:String = "hi"; public var publicGreeting:String = "hello"; function Protean() { trace("Protean instance created"); } }
次のコードは、Protean クラスのインスタンスを作成し、プロパティ aString とプロパティ aNumber をそのインスタンスに追加します。
var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; trace(myProtean.aString, myProtean.aNumber); // testing 3
次のコードは、trace ステートメントを traceProtean() というメソッドに移動します。
var myProtean:Protean = new Protean(); myProtean.aString = "testing"; myProtean.aNumber = 3; myProtean.traceProtean = function () { trace(this.aString, this.aNumber); }; myProtean.traceProtean(); // testing 3
この方法で作成されたメソッドは、Protean クラスのプライベートプロパティまたはメソッドに
アクセスできません。また、Protean クラスのパブリックプロパティまたはメソッドへの参照も、this
キーワードまたはクラス名のいずれかで修飾する必要があります。次の例は、Protean クラスのプライ
ベート変数およびパブリック変数にアクセスしようとする traceProtean() メソッドを示します。
myProtean.traceProtean = function () { trace(myProtean.privateGreeting); // undefined trace(myProtean.publicGreeting); // hello }; myProtean.traceProtean();
データ型の詳細
- Boolean
- int
- Null
- Number
- String
- uint
- void
- Object
データ型の変換
暗黙的な変換は、次のような状況で実行時に行われます。
■ 代入ステートメント内
■ 値が関数パラメータとして渡されるとき
■ 関数から値が返されるとき
■ 加算 (+) 演算子などの特定の演算子を使用した式内
次のコードには、成功する暗黙的な変換と失敗する暗黙的な変換が含
まれています。
class A {} class B extends A {} var objA:A = new A(); var objB:B = new B(); var arr:Array = new Array(); objA = objB; // 変換は成功。 objB = arr; // 変換は失敗。
ブール値を数値に変換する場合、true は値 1 になり、false は値 0 になります。
var myBoolean:Boolean = true; var myUINT:uint = uint(myBoolean); var myINT:int = int(myBoolean); var myNum:Number = Number(myBoolean); trace(myUINT, myINT, myNum); // 1 1 1 myBoolean = false; myUINT = uint(myBoolean); myINT = int(myBoolean); myNum = Number(myBoolean); trace(myUINT, myINT, myNum); // 0 0 0
次のストリング値は数値にキャストすることができます。
trace(uint("5")); // 5 trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUE trace(uint(" 27 ")); // 27 trace(uint("3.7")); // 3 trace(int("3.7")); // 3 trace(int("0x1A")); // 26 trace(Number("3.7")); // 3.7
数値以外の文字を含むストリング値は、int() または uint() でキャストすると 0 を返し、Number()
でキャストすると NaN を返します。変換プロセスでは、先頭および末尾の空白は無視されますが、スト
リング値に 2 つの数値を区切る空白がある場合は、0 または NaN が返されます。
trace(uint("5a")); // 0 trace(uint("ten")); // 0 trace(uint("17 63")); // 0
ActionScript 3.0 では、Number() 関数は 8 進数をサポートしていません
trace(Number("044")); // ActionScript 3.0 44 // ActionScript 2.0 36
シンタックス
コメント
// 単一行コメント /* 複数行 コメント */
定数
定数を作成するために使用する const ステートメントがサポートされています。定数は、変更できない固定値を持つプロパティです。定数には値を 1 回だけ割り当てることが
できますが、定数の宣言のきわめて近くで割り当てる必要があります。たとえば、定数がクラスのメ
ンバーとして宣言されると、宣言の一部としてのみ、またはクラスコンストラクタ内でのみ、その定
数に値を割り当てることができます
class A { public const MINIMUM:int = 0; public const MAXIMUM:int; public function A() { MAXIMUM = 10; } } var a:A = new A(); trace(a.MINIMUM); // 0 trace(a.MAXIMUM); // 10
Flash Player API では、さまざまな定数が定義されています。表記規則により、ActionScript の定数
には大文字だけを使用し、単語はアンダースコア文字 ( _ ) で区切ります。たとえば、MouseEvent ク
ラス定義では、マウス入力に関連するイベントを表す定数にこの命名規則を使用します。
package flash.events { public class MouseEvent extends Event { public static const CLICK:String = "click"; public static const DOUBLE_CLICK:String = "doubleClick"; public static const MOUSE_DOWN:String = "mouseDown"; public static const MOUSE_MOVE:String = "mouseMove"; ... } }
演算子
- 基本演算子
[] 配列の初期化 {x:y} オブジェクトの初期化 () 式のグループ化 f(x) 関数の呼び出し new コンストラクタの呼び出し x.y x[y] プロパティへのアクセス <></> XMLList オブジェクトの初期化 (E4X) @ 属性へのアクセス (E4X) :: 名前の修飾 (E4X) .. 子孫 XML エレメントへのアクセス (E4X)
- 後置演算子
++ インクリメント ( 後置方式) -- デクリメント ( 後置方式)
- 単項演算子
++ インクリメント ( 前置方式) -- デクリメント ( 後置方式) + 単項プラス - 単項マイナス ! 論理否定 (NOT) ~ ビット単位の論理否定 (NOT) typeof タイプ情報を返す void 未定義の値を返す
- 乗法演算子
* 乗算 / 除算 % 剰余
- 加算演算子
+ 加算 - 減算
- ビット単位シフト演算子
<< ビット単位の左シフト >> ビット単位の右シフト >>> ビット単位の符号なし右シフト
- 関係演算子
< より小さい > より大きい <= より小さいか等しい >= より大きいか等しい as データ型のチェック in オブジェクトプロパティのチェック instanceof プロトタイプチェーンのチェック is データ型のチェック
- 等価演算子
== 等価 != 不等価 === 厳密な等価 !== 厳密な不等価
- ビット論理演算子
& ビット単位の論理積 (AND) ^ ビット単位の排他的論理和 (XOR) | ビット単位の論理和 (OR)
- 論理演算子
&& 論理積 (AND) || 論理和 (OR)
- 条件演算子
?: 条件
- 代入演算子
= 代入 *= 乗算後代入 /= 除算後代入 %= 剰余を代入 += 加算後代入 -= 減算後代入 <<= ビット単位での左シフト後代入 >>= ビット単位での右シフト後代入 >>>= ビット単位での符号なし右シフト後代入 &= ビット単位の論理積 (AND) を代入 ^= ビット単位の論理積 (XOR) を代入 |= ビット単位の論理和 (OR) を代入
条件
- if
if (x > 20) { trace("x is > 20"); } else if (x < 0) { trace("x is negative"); }
- switch
var someDate:Date = new Date(); var dayNum:uint = someDate.getDay(); switch(dayNum) { case 0: trace("Sunday"); break; case 1: trace("Monday"); break; case 2: trace("Tuesday"); break; case 3: trace("Wednesday"); break; case 4: trace("Thursday"); break; case 5: trace("Friday"); break; case 6: trace("Saturday"); break; default: trace("Out of range"); break; }
- for
var i:int; for (i = 0; i < 5; i++) { trace(i); }
- for..in
var myObj:Object = {x:20, y:30}; for (var i:String in myObj) { trace(i + ": " + myObj[i]); } // 出力 : // x: 20 // y: 30
- for each..in
var myXML:XML = <users> <fname>Jane</fname> <fname>Susan</fname> <fname>John</fname> </users>; for each (var item in myXML.fname) { trace(item); } /* 出力 Jane Susan John */
- while
var i:int = 0; while (i < 5) { trace(i); i++; }
- do..while
var i:int = 0; do { trace(i); i++; } while (i < 5)
関数
関数をクラス定義の一部として定義した場合、またはオブジェクトのインスタンスに関連付けた場合は、メソッドと呼びます。
関数がその他の方法で定義された場合は、メソッドクロージャと呼びます
関数の定義
- Functionステートメント
function traceParameter(aParam:String) { trace(aParam); } traceParameter("hello"); // hello
- 関数式
var traceParameter:Function = function (aParam:String) { trace(aParam); }; traceParameter("hello"); // hello
1 つ目の違いは、関数式は、メモリ管理およびガベージコレクションに関してオ
ブジェクトとして単独で存在しません。つまり、配列エレメントやオブジェクトプロパティなどの別の
オブジェクトに関数式を割り当てると、コード内にその関数式への唯一の参照が作成されます。関数式
が関連付けられている配列またはオブジェクトがスコープ外に移動するか、使用できなくなった場合、
関数式にアクセスできなくなります。配列またはオブジェクトが削除されると、関数式が使用するメモ
リはガベージコレクションの対象となります。つまり、メモリは解放されて他の目的に再利用されます。
その一方で、関数が最初に function ステートメントで定義された場合、関数はそのオブジェクトとし
て存在し、関連付けられているプロパティを削除しても存在します。
function ステートメントと関数式の 2 つ目の違いは、function ステートメントは、関数ステートメント
の前に現れるステートメント内を含む、定義されたスコープ全体で存在することです。対照的に、関数
式はそれ以降のステートメントに対してのみ定義されます。
関数からの値の戻り
function doubleNum(baseNum:int):int { return (baseNum * 2); }
ネストされた関数
次のコードは getNameAndVersion() 関数内でネストされた関数を 2 つ宣言します。function getNameAndVersion():String { function getVersion():String { return "9"; } function getProductName():String { return "Flash Player"; } return (getProductName() + " " + getVersion()); } trace(getNameAndVersion()); // Flash Player 9
ネストされた関数が外部コードに渡される場合、メソッドクロージャとして渡されます。つまり、関
数が定義されるとき、スコープ内にある定義を保持します。
関数のパラメータ
ActionScript 3.0 では、値はすべてオブジェクトとして格納されているため、すべてのパラメータは参照渡しです。
デフォルトのパラメータ値
function defaultValues(x:int, y:int = 3, z:int = 5):void { trace(x, y, z); } defaultValues(1); // 1 3 5
arguments オブジェクト
パラメータが関数に渡されると、arguments オブジェクトを使用して関数に渡されたパラメータについての情報にアクセスできます。arguments オブジェクトには、次のような重要な特性があります。
■ arguments オブジェクトは、関数に渡されるすべてのパラメータを含む配列です。
■ arguments.length プロパティは、関数に渡されるパラメータの数を報告します。
■ arguments.callee プロパティを使用すると、関数自体を参照することができます。これは関数式の再帰呼び出しに便利です。
arguments オブジェクトの配列を使用すると、関数に渡されるパラメータが関数定義内で定義されたかどうかに関わらず、このパラメータにアクセスできます。
次の例では、arguments 配列と arguments.length プロパティを使用して、traceArgArray() 関数に
渡されるすべてのパラメータをトレースします。
function traceArgArray(x:int):void { for (var i:uint = 0; i < arguments.length; i++) { trace(arguments[i]); } } traceArgArray(1, 2, 3); // 出力 : // 1 // 2 // 3
arguments.callee を使用した再帰呼び出し
var factorial:Function = function (x:uint) { if(x == 0) { return 1; } else { return (x * arguments.callee(x - 1)); } } trace(factorial(5)); // 120
関数宣言で ... (rest) パラメータを使用する場合は、arguments オブジェクトを使用することはでき
ません。代わりに、宣言したパラメータ名を使用してパラメータにアクセスする必要があります。
ストリング “arguments” をパラメータ名として使用しないようにする必要があります。このストリン
グは arguments オブジェクトをシャドウするためです。
... (rest) パラメータ
■このパラメータを使用すると、任意の数のカンマ区切りのパラメータを受け入れる配列パラメータを指定できます。■パラメータには、予約語ではない名前を指定することができます。
■このパラメータ宣言は、指定される最後のパラメータである必要があります。
■このパラメータを使用すると、arguments オブジェクトは使用できなくなります。
■... (rest) パラメータには arguments 配列および arguments.length プロパティと同じ機能がありますが、arguments.callee のような機能はありません。
次の例では、arguments オブジェクトではなく、... (rest) パラメータを使用して traceArgArray() 関数を記述し直します。
function traceArgArray(... args):void { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // 出力 : // 1 // 2 // 3
... (rest) パラメータは、パラメータリストの最後のパラメータであれば、他のパラメータと使用すること
もできます。次の例では、traceArgArray() 関数を変更して、最初のパラメータ x を int 型にし、2 つ
目のパラメータが ... (rest) パラメータを使用するようにします。最初のパラメータは ... (rest) パラメータ
により作成された配列の一部ではなくなるため、最初の値は出力されません。
function traceArgArray(x: int, ... args) { for (var i:uint = 0; i < args.length; i++) { trace(args[i]); } } traceArgArray(1, 2, 3); // 出力 : // 2 // 3
オブジェクトとしての関数
関数をパラメータとして渡す場合、識別子のみを使用し、メソッドを呼び出すために使用する括弧は使用しません。
たとえば、次のコードは、addEventListener() メソッドへのパラメータとして clickListener() という関数を渡します。
addEventListener(MouseEvent.CLICK, clickListener);
関数には他のオブジェクトと同様に関数にプロパティおよびメソッドを含めることができます。
someFunction.counter = 0; function someFunction():void { someFunction.counter++; } someFunction(); someFunction(); trace(someFunction.counter); // 2
メソッドクロージャ
" メソッドクロージャ" は、関数の静的なスナップショットとその " レキシカル環境" を含むオブジェクトです。■関数のレキシカル環境には、関数のスコープチェーン内のすべての変数、プロパティ、メソッド、およびオブジェクトがその値と共に含まれます。
■メソッドクロージャは、オブジェクトまたはクラスとは別に、関数が実行されるたびに作成されます。
■メソッドクロージャはそのメソッドクロージャが定義されたスコープを保持することから、関数がパラメータまたは戻り値として別のスコープに渡されると興味深い結果が生まれます。
次のコードは 2 つの関数を作成します。foo() は、矩形の面積を計算する rectArea() と
いうネストされた関数を返し、bar() は、foo() を呼び出し、myProduct という変数に返されたメ
ソッドクロージャを格納します。bar() 関数が独自のローカル変数 x を値 2 で定義しても、メソッド
クロージャ myProduct() が呼び出されると、関数 foo() 内で値 40 で定義された変数 x が維持され
ます。このため、bar() 関数は値 8 ではなく、値 160 を返します。
function foo():Function { var x:int = 40; function rectArea(y:int):int { // メソッドクロージャが定義された return x * y } return rectArea; } function bar():void { var x:int = 2; var y:int = 4; var myProduct:Function = foo(); trace( myProduct(4) ); // メソッドクロージャが呼び出された } bar(); // 160
2007年06月27日(水) 16:42:24 Modified by daijirow