Adobe Flash非公式テクニカルノート ActionScript 3.0: 言語の概要
オブジェクトは、ActionScript 3.0の言語の心臓部に位置する、基本的な構成要素です。宣言された変数や記述された関数、生成されたクラスのインスタンスひとつひとつが、それぞれオブジェクトです。ActionScript 3.0のプログラムはオブジェクトの集まりと考えられ、それらがタスクを行ったり、イベントに応じたり、オブジェクト同士でコミュニケーションしたりします。 JavaやC++のオブジェクト指向プログラミング(OOP)をよく知っているプログラマは、オブジェクトを2種類のメンバーが備わったモジュールだと考えるかもしれません。その2種類というのは、メンバー変数やプロパティに保持されたデータと、メソッドを通してアクセスできる動作(ビヘイビア)です。ActionScript 3.0の準拠する標準のECMAScript第4版草案はオブジェクトを、この考え方と似てはいるものの、少し違ったかたちで定義します。ECMAScript草案では、オブジェクトとは単にプロパティの集まりです[*1]。プロパティは容れ物で、データだけでなく、関数その他のオブジェクトも保持できます。関数がこのようなかたちでオブジェクトに設定されると、メソッドと呼ばれます。 ECMAScfipt草案の定義は、JavaやC++の経験をもつプログラマからは少し奇異に映るかもしれません。しかし実際には、ActionScript 3.0のクラスにおけるオブジェクトの型は、JavaやC++と極めて近いやり方で定義されています。オブジェクトのふたつの定義を区別することは、ActionScriptのオブジェクトモデルやその他の高度なテーマを議論する際には重要です。しかし、他の多くの場合は、「プロパティ」という用語は、クラスのメンバー変数を意味し、メソッドと対比されます。たとえば、「ActionScript 3.0コンポーネントリファレンスガイド」が用いる「プロパティ」という語は、変数またはgetter/setterプロパティを指します。また、「メソッド」という語は、クラスを構成する一部となる関数の意味で使われています。 ActionScriptとJavaやC++とでクラスが微妙に異なってくるのは、ActionScriptにおいてはクラスは単なる抽象的な存在ではないということです。ActionScriptのクラスは「クラスオブジェクト」として表され、そのオブジェクトがプロパティやメソッドをもちます。このことにより、JavaやC++のプログラマには異質に感じられるであろうテクニックも可能になります。それはたとえば、ステートメントまたは実行するコードを、クラスやパッケージのトップレベルに加えるといったことです。 もうひとつ、ActionScriptとJavaやC++とでクラスが異なるのは、ActionScriptのクラスがいずれも「プロトタイプオブジェクト」といわれるものを備えることです。従来のAcvtionScriptのバージョンでは、プロトタイプオブジェクトは、「プロトタイプチェーン」で結びつけられて、クラスの継承階層全体を統合する基盤として位置づけられていました[*2]。しかし、ActionScript 3.0では、プロトタイプオブジェクトは継承の仕組みにおいて、かぎられた役割を果たすだけです。プロトタイプオブジェクトが役立ちうるのは、静的(static)なプロパティやメソッドの代わりとして、プロパティやその値をクラスのすべてのインスタンスで共有しようという場合でしょう。 従来、ActionScriptの上級のプログラマは、特別な定義済みの言語エレメントを用いて、プロトタイプチェーンを直接扱うことができました。今や、より完成したクラスベースのプログラミングインターフェイスが言語に実装され、__proto__や__resolveといった多くの特別な言語エレメントは、もはやActionScriptに備わっていません。さらに、内部的な継承のメカニズムを最適化し、Flash Playerのパフォーマンスを大きく向上させたことにより、継承メカニズムには直接アクセスすることができなくなりました。
出典 作成者: 野中文雄 Copyright © 2001-2008 Fumio Nonaka. All rights reserved. |
||||||