HTML5テクニカルノート EaselJSのPointクラスの実装を見る
EaselJSは、CreateJS Suiteのおおもととなるライブラリです。その中でも備わるプロパティやメソッドが少なくて簡素なPointクラスの実装を見ることは、CreareJSのライブラリを研究するはじめの一歩に適しているでしょう。 01 PointクラスのプロパティとメソッドPointクラスは、コンストラクタの他には、ふたつのプロパティとふたつのメソッドが備わっています(表001)。プロパティはそれぞれ(x, y)座標値を示します。また、Point.clone()メソッドは、同じ(x, y)座標値の新たなオブジェクトを複製します。Point.toString()メソッドは、インスタンスの文字列表現を返します。 表001■Pointクラスのプロパティとメソッド
02 Pointクラスの基本的な中身Pointクラスにコンストラクタとふたつずつのプロパティおよびメソッドを定めると、基本は以下のようなクラス定義になります。コンストラクタ(Point())からは、別に初期化のメソッド(initialize())を呼出しています。初期化のメソッドは、引数があればその値を、なければデフォルト値をインスタンスのプロパティに定めます。
クラスが備えるべきメソッド(clone()とtoString())は、JavaScriptではコンストラクタ関数のFunction.prototypeプロパティに定めます。また、インスタンスにプロパティが与えられていない場合のプロパティ(xとy)のデフォルト値も、ここに設定しています。 03 名前空間に定めたPointクラスCreateJS Suiteのクラスは、実際には名前空間(createjs)に定められています(「CreateJS Suiteのクラスに名前空間が設定される」参照)。Pointクラスはつぎのコード001のように、この名前空間にコンストラクタ関数を定め、プロパティやメソッドを備えています。なお、名前空間(createjs)はライブラリのクラスすべてが用いますので、すでに初期化されているかを確かめ、されていない場合には新たにObjectインスタンスを与えました(第1行目。「論理演算子を使った条件判定」02「初期化されていない変数に値を与える」参照)。 コード001■Pointクラスの実質的な中身
EaselJSライブラリのPointクラスは、実質的にこのコード001の中身になります。ただ、かなり書き方が煩わしく、とくにコンストラクタ関数のプロトタイプオブジェクト(createjs.Point.prototype)を長々と書連ねるのが気になります。 04 名前のない関数でPointクラスを定めるコンストラクタ関数やそのプロトタイプオブジェクト(Function.prototypeプロパティ)の参照は、つぎのように変数を宣言して予め与えておけば、コードが見やすくなります。また、備えるべきプロパティやメソッドが増えても、コードは楽に書けます。
ただし、グローバルにvar宣言した変数は、納めた値や参照は消せても、存在そのものを除くことはできません。多くのクラスを定めるときは、変数が重複するおそれもありますし、要らないものが残ってしまうのはできるかぎり避けたいところです。 var宣言が関数の中であればローカル変数になりますので、外の変数との重複は気にしなくて済み、外から参照されるおそれもありません。そこで、実際のCreateJS Suiteのクラスは、後掲コード002のように名前のない関数の中で定められています。
名前のない関数の中で、コンストラクタはローカル変数(Point)に定めています(第2〜3行目)。そして、この名前のない関数そのものは、変数に入れていません。つまり、メモリには残らないということです。そこで、書き終わりに括弧()を加えて直ちに呼出しています(第20行目)。つまり、つぎのような呼出し方です。 function() { /* ...[中略]... */ }() ローカル変数(Point)のコンストラクタ関数も、名前のない関数の実行が済めばそのままではメモリから消えます。そこで、関数の最後に名前空間(createjs)に加えているのです(第19行目)。名前空間は関数の外に定められていますから、コンストラクタの参照は保たれます(第1行目)。 コード002■EaselJSライブラリの実際のPointクラス
コンストラクタの参照が残ってさえいれば、プロトタイプオブジェクトに定めたプロパティやメソッドも使えます。また、名前のない関数内でのvar宣言は、ローカル変数(Pointとp)になりますので、関数の外からは見えなくなります(第3および第6行目)。 作成者: 野中文雄 Copyright © 2001-2012 Fumio Nonaka. All rights reserved. |
||||||||||||||||||||||||