| 209 | |
| 210 | === プロトタイプ型オブジェクト指向 === |
| 211 | |
| 212 | !JavaScript でオブジェクトと言えば、複雑なデータ構造を表す'''連想配列'''を指します。「[#introduction-hashmap 複雑なデータ構造を自由に書ける]」の節で示したアレですね。 |
| 213 | |
| 214 | {{{ |
| 215 | // オブジェクト |
| 216 | var obj = { |
| 217 | "foo": "hoge", |
| 218 | "bar": "fuga", |
| 219 | "baz": "oyoyo" |
| 220 | }; |
| 221 | }}} |
| 222 | |
| 223 | ところで、オブジェクト指向プログラミングといえば、オブジェクトの生成・破棄を行う処理を定義するコンストラクタ・デストラクタがあり、メンバメソッドがあり、カプセル化のためのアクセス制約があり、クラスの継承がある、といったいわゆる Java 的な世界観が連想されます。 !JavaScript の場合はクラスではなく'''プロトタイプ'''というアプローチではありますが、似たようなことを行うための記法が用意されています。 |
| 224 | |
| 225 | まず、関数の定義はそのままコンストラクタとしても機能します。 |
| 226 | |
| 227 | {{{ |
| 228 | // クラス定義のようなもの |
| 229 | function MyObject() { |
| 230 | // メンバ変数の定義 |
| 231 | this.foo = "hoge"; |
| 232 | this.bar = "fuga"; |
| 233 | this.baz = "oyoyo"; |
| 234 | } |
| 235 | |
| 236 | // 上記を用いてオブジェクトインスタンスを生成 |
| 237 | var obj = new MyObject(); |
| 238 | |
| 239 | alert("foo: " + obj.foo); // "foo: hoge" と表示される |
| 240 | }}} |
| 241 | |
| 242 | デストラクタは残念ながら存在しません。オブジェクトが必要なくなるタイミングで特定の処理を行いたい場合は、自分でメソッドを用意して、自分で確実に呼び出すよう記述する必要があります。 |
| 243 | |
| 244 | メンバメソッドはメンバ変数に関数を代入でも良いのですが、通常はプロトタイプのメンバに代入します。 |
| 245 | |
| 246 | {{{ |
| 247 | // クラス定義のようなもの |
| 248 | function MyObject() { |
| 249 | // メンバ変数の定義 |
| 250 | this.foo = "hoge"; |
| 251 | this.bar = "fuga"; |
| 252 | this.baz = "oyoyo"; |
| 253 | } |
| 254 | |
| 255 | // メンバメソッド定義 |
| 256 | MyObject.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 | // 上記を用いてオブジェクトインスタンスを生成 |
| 277 | var obj = new MyObject(); |
| 278 | |
| 279 | obj.show("bar"); // "bar: fuga" と表示 |
| 280 | obj.showAll(); // foo, bar, baz すべて表示 |
| 281 | }}} |