このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
ページを取得する準備は整ったが、
次のステップに移る前に、いつものようにクラス化を行おう。
では、「MixiSession」クラスを考えてみよう。
このクラスは mixi へのログインセッションを管理し、
認証状態の mixi のページを取得する機能を持たせる。
ログインと、XMLHttpRequest のラッパーというわけだ。
まず、コンストラクタとフィールドを決めよう。
コンストラクタは、メールアドレスとパスワードを受け取る。
フィールドは、XMLHttpRequest を格納するために必要だ。
「_client」という名前にしよう。
Java 風に書くと以下のようなイメージだ。
class MixiSession {
XMLHttpRequest _client;
MixiSession(String mailAddress, String password) {
_client = new XMLHttpRequest();
}
}
では、「MixiSession」クラスの枠組みを作ってみよう。
「MixiSession.js」を lib の中に作成してそこに書く。
========== MixiSession.js ==========
// クラスのコンストラクタ
function MixiSession(mailAddress, password) {
this._client = new XMLHttpRequest();
}
========== end of MixiSession.js ==========
JavaScript にはクラス定義がないので、
class ブロックも存在しない。
その代わり、直接グローバルスコープに記述した関数が、
コンストラクタとクラス定義の役割を兼ねる。
ここでは、MixiSession 関数がコンストラクタというわけだ。
関数は new 演算子をつけて呼び出された場合、
オブジェクトのコンストラクタとして機能する。
通常の関数と区別するため、コンストラクタは一般的に、
クラスを表す大文字で始まる英語名で命名する事が多い。
コンストラクタ内では、this キーワードが、
新しく作成されたインスタンスへの参照を持つ。
このあたりは Java や C# と同じだ。
作成されたばかりのインスタンスは、
何のフィールド(プロパティ)も持たないので、
コンストラクタでは、フィールドの定義と初期化を行う。
フィールドは、値の代入をすることで定義される。
上の例では、新しく作成したインスタンスに、
「_client」フィールドを追加している。
クラス定義を持たない JavaScript は、
Java や C# などのような厳密なフィールド定義を持たず、
あらゆるオブジェクトに対して、
実行時に動的に自由にプロパティを追加することができる。
「_client」プロパティはどこにも定義されていないのだが、
代入した時点で定義されて利用可能になるのだ。
上記では this._client という表記をしているが、
this["_client"] と大括弧を使って書くこともできる。
両者はまったく同じ意味を持つ。
別の視点で考えると、JavaScript のオブジェクトは、
HashTable なようなものであるという考え方もできる。
そうすれば、動的に追加できることも理解しやすい。
このあたりは、Perl のオブジェクトに似ている。
注意点としては、コンストラクタ内であっても
this に対する暗黙の参照を持たないので、
this を省略できず、this.フィールドとする必要がある事だ。
this がないと、グローバルスコープの変数を意味するのだ。
さて、明日はメソッドを定義してみよう。