Changes between Version 8 and Version 9 of HowTo/JavaScriptLanguageIntroduction


Ignore:
Timestamp:
Jul 31, 2010, 9:39:03 PM (14 years ago)
Author:
村山 俊之
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • HowTo/JavaScriptLanguageIntroduction

    v8 v9  
    8585}}}
    8686
    87 === 複雑なデータ構造を自由に書ける ===
     87=== 複雑なデータ構造を自由に書ける === #introduction-hashmap
    8888
    8989C や Java がデータ構造の構成を構造体やクラスとしてあらかじめ定義しなければならないのに対し、 !JavaScript のオブジェクトはいつでも好きなだけメンバを追加できます。
     
    207207
    208208[[FootNote]]
     209
     210=== プロトタイプ型オブジェクト指向 ===
     211
     212!JavaScript でオブジェクトと言えば、複雑なデータ構造を表す'''連想配列'''を指します。「[#introduction-hashmap 複雑なデータ構造を自由に書ける]」の節で示したアレですね。
     213
     214{{{
     215// オブジェクト
     216var obj = {
     217    "foo": "hoge",
     218    "bar": "fuga",
     219    "baz": "oyoyo"
     220};
     221}}}
     222
     223ところで、オブジェクト指向プログラミングといえば、オブジェクトの生成・破棄を行う処理を定義するコンストラクタ・デストラクタがあり、メンバメソッドがあり、カプセル化のためのアクセス制約があり、クラスの継承がある、といったいわゆる Java 的な世界観が連想されます。 !JavaScript の場合はクラスではなく'''プロトタイプ'''というアプローチではありますが、似たようなことを行うための記法が用意されています。
     224
     225まず、関数の定義はそのままコンストラクタとしても機能します。
     226
     227{{{
     228// クラス定義のようなもの
     229function MyObject() {
     230    // メンバ変数の定義
     231    this.foo = "hoge";
     232    this.bar = "fuga";
     233    this.baz = "oyoyo";
     234}
     235
     236// 上記を用いてオブジェクトインスタンスを生成
     237var obj = new MyObject();
     238
     239alert("foo: " + obj.foo);  // "foo: hoge" と表示される
     240}}}
     241
     242デストラクタは残念ながら存在しません。オブジェクトが必要なくなるタイミングで特定の処理を行いたい場合は、自分でメソッドを用意して、自分で確実に呼び出すよう記述する必要があります。
     243
     244メンバメソッドはメンバ変数に関数を代入でも良いのですが、通常はプロトタイプのメンバに代入します。
     245
     246{{{
     247// クラス定義のようなもの
     248function MyObject() {
     249    // メンバ変数の定義
     250    this.foo = "hoge";
     251    this.bar = "fuga";
     252    this.baz = "oyoyo";
     253}
     254
     255// メンバメソッド定義
     256MyObject.prototype = {
     257    "show" = function(member) {
     258        if (this[member] == null)
     259            alert(member + "なんてメンバはねーよ!!");
     260        else
     261            alert(member + ": " + this[member]);
     262    },
     263    "showAll" = function() {
     264        var dump = "";
     265        for (var member in this) {
     266            if (dump != "")
     267                dump += "\n";
     268            if (typeof this[member] != "string")
     269                continue;
     270            dump += member + ": " + this[member];
     271        }
     272        alert(dump);
     273    }
     274}
     275
     276// 上記を用いてオブジェクトインスタンスを生成
     277var obj = new MyObject();
     278
     279obj.show("bar");    // "bar: fuga" と表示
     280obj.showAll();      // foo, bar, baz すべて表示
     281}}}