Objectの生成は、次の構文により行います。
ObjectType[ : ValueType] ObjectName; … 【1】 ObjectType[ : ValueType] ObjectName[ n ]; … 【2】 var 変数名 = new ObjectType[ : ValueType]; … 【3】 var 変数名 = new ObjectType[ : ValueType] (); … 【4】 var 変数名 = new ObjectType[ : ValueType] ( コンストラクタ引数 ); … 【5】
【1】と【2】の書式の場合、このプログラムを実行したオブジェクトが親オブジェクトとなる階層構造に接続され、ObjectNameで指定した名前を持つオブジェクトが生成されます。
[ : ValueType] は省略可能なオプションで、オブジェクトのデータ属性を指定します。
例
TextBox:Number b;
上記の例では、数値型のデータとしてテキスト入力欄を生成します。ValueTypeはクラスの種類により固定されているものもあります。例えばDateEditクラスのオブジェクトは常にDate型のオブジェクトとなりますので、ValueTypeを指定することはできません。TextBoxのようにValueTypeを指定可能なオブジェクトの生成でValueTypeを指定しない場合、String(文字列)型として実行されます。
書式【2】の [n] は配列化を指定します。[]を付加するとオブジェクトは配列として生成され、nにより生成時の要素数を指定します。
【3】【4】【5】の書式の場合、生成されたオブジェクトのリファレンスがvar変数に格納されます。この場合、オブジェクトは固有の名前を持たず、変数名でアクセスすることになります。変数はオブジェクトの実体ではありませんので、状況により名前は変化します。
例
var text = new String("sample1"); var sample = text;
この例の場合、Stringオブジェクトはtextまたはsampleの名前で参照できます。どちらもStringオブジェクトリファレンスで同じインスタンスを指します。したがって、
text.value = "sample2"; print(sample);
とすると、print関数によりデバッガに表示されるのは、"sample2"となります。
書式【4】の場合、クラスのコンストラクタが呼び出され、デフォルトの初期化が行われます。書式【5】の場合、コンストラクタ引数により、オブジェクトの初期化を指示することができます。コンストラクタは、オブジェクトの種類により初期化する内容、指定する内容、意味、パラメータの数が変わります。
例 Arrayクラスのコンストラクタ
var a = new Array("aaa", "bbb", "ccc");
"aaa"、"bbb"、"ccc"がArray要素として生成されます。
例 Stringクラスのコンストラクタ
var s = new String("sample");
内容がsampleの文字列となります。
Object生成と同時にプロパティ設定を行い初期化することができます。
DisplayType ObjectName { X = 10; Y = 10; Width = 20; Height = 20; : } DataType ObjectName = 10;
クラスのプロパティには初期化後の変更ができないものがあります。このようなプロパティは必ず初期化で設定する必要があります。
ほとんどのオブジェクトは"//"(Rootオブジェクト)を基点とする階層構造に属します。階層構造に新しいオブジェクトを付加するためには以下のように記述します。
DataType Object1 { DataType Object2 { DataType Object3 { : } } }
一部のオブジェクトは、階層構造に制約を持ちます。例えば表形式の表示を行うFlexViewオブジェクトの場合、子として生成できるオブジェクトはFlexRecordに限られ、FlexRecordの子として生成できるオブジェクトはFlexItemの派生クラスに限られます。
この制約はFlexViewオブジェクトは、単独で表を表現するのではなく、表の行を表現するFlexRecordオブジェクト、表の列を表現するFlexItemオブジェクトの複合体として表を表現しているためです。
"//"(Rootオブジェクト)を基点とするオブジェクトツリーに含むオブジェクトには、名前を付けることができます。オブジェクトの名前には以下の制約があります。
1. 英字または全角の文字で始まること
2. 2文字目以降は英数字、アンダースコア(_)または全角文字であること
正しい例
ABC
日本語のオブジェクト名
txt顧客コード
txt_custcode
不正な例
12_code ← 数字で始まる
txt custcode ← 空白文字を含む
txt-custcode ← 記号を含む
txt顧客住所(都道府県から市町村名まで) ← 長すぎる
全角文字の空白や記号は利用することができますが、間違いとなりやすいためできるだけ利用しないようにしてください。
全角文字の変数名は、環境によっては(UNIX系のOSでCRSソースを管理する場合など)文字化けして取り扱いが悪くなることがあります。ご注意ください。
オブジェクト同士の衝突
新しいオブジェクトを生成した同じ階層に、すでに同じ名前のオブジェクトが存在する場合、既存のオブジェクトは自動的に削除されます。
プロパティとの衝突
プロパティ名と同じ名前で子オブジェクトを生成すると、オブジェクトの検索が優先されます。プロパティはオブジェクトに隠れて利用することができなくなります。
メソッドとの衝突
メソッド名と同じ名前で子オブジェクトを生成すると、オブジェクトの検索が優先されます。メソッドはオブジェクトに隠れて利用することができなくなります。
クラス名との衝突
クラス名と同じ名前のオブジェクトを生成すると、そのオブジェクトのスコープ内では、衝突したクラスのスタティックメソッドやスタティックプロパティにアクセスできなくなります。