Flash Lite 2 |
|||
| Flash Lite 2.x ActionScript リファレンスガイド > ActionScript クラス > Object > addProperty (Object.addProperty メソッド) | |||
getter/setter プロパティを作成します。Flash は getter/setter プロパティを読み込むと、get 関数を呼び出します。この関数の戻り値は name の値になります。Flash は getter/setter プロパティを書き込むと、set 関数を呼び出し、それに新しい値をパラメータとして渡します。指定された名前のプロパティが既に存在する場合は、新しいプロパティによって上書きされます。
get 関数はパラメータがない関数です。戻り値のタイプは不特定です。戻り値のタイプは呼び出しごとに変わることがあります。戻り値は、プロパティの現在の値として扱われます。
set 関数のパラメータは 1 つであり、プロパティの新しい値です。たとえば、プロパティ x がステートメント x = 1 によって割り当てられた場合、set 関数には Nubmer 型のパラメータ 1 が渡されます。set 関数の戻り値は無視されます。
getter/setter プロパティはプロトタイプオブジェクトに追加できます。getter/setter プロパティをプロトタイプオブジェクトに追加すると、プロトタイプオブジェクトを継承するすべてのオブジェクトインスタンスは getter/setter プロパティを継承します。つまり、1 つのプロトタイプオブジェクトに getter/setter プロパティを追加するだけで、クラスのすべてのインスタンスに同じプロパティを追加できます (プロトタイプオブジェクトにメソッドを追加するのと似ています)。継承先のプロトタイプオブジェクトの getter/setter プロパティに対して呼び出される get/set 関数には、このプロトタイプオブジェクトへの参照ではなく、継承元のオブジェクトへの参照が渡されます。
正常に呼び出されなかった場合は、Object.addProperty() が失敗し、エラーが発生することがあります。次の表は、発生する可能性があるエラーの一覧です。
エラー状態 結果
name が有効なプロパティ名ではありません。たとえば、空のストリングです。
false が返され、プロパティは追加されません。
getter は有効な関数オブジェクトではありません。
false が返され、プロパティは追加されません。
setter は有効な関数オブジェクトではありません。
false が返され、プロパティは追加されません。
使用できるバージョン : ActionScript 1.0、Flash Lite 2.0 - ActionScript 2.0 クラスでは、このメソッドの代わりに get または set を使用できます。
name: String - 作成対象のオブジェクトプロパティの名前を示すストリング。
getter: Function - プロパティの値を取得するために呼び出される関数。このパラメータは Function オブジェクトです。
setter: Function - プロパティの値を設定するために呼び出される関数。このパラメータは Function オブジェクトです。このパラメータに値 null を渡すと、プロパティは読み取り専用になります。
Boolean - ブール値。プロパティが正常に作成された場合は true を返します。それ以外の場合は false を返します。
次の例では、オブジェクトに 2 つの内部メソッド setQuantity() および getQuantity() があります。bookcount というプロパティの値を設定または取得するときに、これらのメソッドが呼び出されます。もう 1 つの getTitle() という内部メソッドは、bookname プロパティに設定されている読み取り専用の値を返します。スクリプトが myBook.bookcount の値を取得すると、ActionScript インタプリタは myBook.getQuantity() を自動的に呼び出します。スクリプトで myBook.bookcount の値を修正すると、インタプリタは myObject.setQuantity() を呼び出します。bookname プロパティでは set 関数を指定していません。したがって、bookname プロパティ値を変更する試みは無視されます。
function Book() {
this.setQuantity = function(numBooks: Number): Void {
this.books = numBooks;
};
this.getQuantity = function(): Number {
return this.books;
};
this.getTitle = function(): String {
return "Catcher in the Rye";
};
this.addProperty("bookcount", this.getQuantity, this.setQuantity);
this.addProperty("bookname", this.getTitle, null);
}
var myBook = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
// You ordered 5 copies of Catcher in the Rye を出力する
前の例は有効ですが、bookcount および bookname プロパティが Book オブジェクトの各インスタンスに追加されます。オブジェクトの各インスタンスで 2 つのプロパティが必須となります。クラスに bookcount や bookname のようなプロパティが多数ある場合は、多大なメモリを消費します。代わりの方法として、bookcount および bookname プロパティを 1 つの場所にだけ存在させるために、プロパティを Book.prototype に追加します。このようにしても、結果は bookcount プロパティと bookname プロパティをすべてのインスタンスに直接追加したシンタックス例のコードと同じです。Book インスタンスのいずれかのプロパティにアクセスした場合に、プロパティが存在しなければ、プロトタイプチェーンを上にたどることによって Book.prototype で定義されたバージョンが見つかります。次の例では、プロパティを Book.prototype に追加する方法を示します。
function Book() {}
Book.prototype.setQuantity = function(numBooks: Number): Void {
this.books = numBooks;
};
Book.prototype.getQuantity = function(): Number {
return this.books;
};
Book.prototype.getTitle = function(): String {
return "Catcher in the Rye";
};
Book.prototype.addProperty("bookcount", Book.prototype.getQuantity, Book.prototype.setQuantity);
Book.prototype.addProperty("bookname", Book.prototype.getTitle, null);
var myBook = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
次の例では、ActionScript 2.0 で利用可能な暗黙的な getter および setter 関数を使用する方法を示しています。Book 関数を定義して Book.prototype を編集する代わりに、Book.as という名前の外部ファイルに Book クラスを定義します。次のコードは、Book.as という名前の別の外部ファイルに配置する必要があります。このファイルは、Flash アプリケーションのクラスパスに含まれ、このクラス定義のみを格納します。
class Book {
var books: Number;
function set bookcount(numBooks: Number): Void {
this.books = numBooks;
}
function get bookcount(): Number {
return this.books;
}
function get bookname(): String {
return "Catcher in the Rye";
}
}
次のコードは、FLA ファイルに配置することができ、前の例の場合と同じ機能を果します。
var myBook: Book = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);