2006 年 7 月 24 日 23 時 9 分

MixiSession クラス


このアーカイブは同期化されません。 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 がないと、グローバルスコープの変数を意味するのだ。

さて、明日はメソッドを定義してみよう。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.