JavaScript/Object
オブジェクト (object) とは、JavaScriptで扱うことのできる物体です。JavaScriptの数値や文字列、関数などのデータはすべてオブジェクトです。たとえばStringオブジェクトは文字列の長さを返すlengthというプロパティを持っているので、alert( "Hello, world!".length ); を実行すると "13" と表示されます。
連想配列[編集]
もっとも単純なオブジェクトは次のような形をしています。
var object = { 'zero': 0, 'one' : 1, 'two' : 2 }; alert( object.zero ); // 0 alert( object['zero'] ); // 0
オブジェクトにドット記法またはブラケット記法でキーの文字列を指定すると、対応する値を取り出すことができます。このようなデータ構造を連想配列(れんそうはいれつ、associative array)といいます。キーの文字列はプロパティ (property) と呼ばれます。
JavaScriptにおいて、オブジェクトと連想配列はまったく同じものです。たとえばStringオブジェクトのlengthプロパティというのは、まさにStringという連想配列のlengthプロパティのことを指しています。
プロパティは文字列でなければなりませんが(数値を指定すると文字列に変換されます)、値には数値や文字列だけでなく、関数などあらゆるオブジェクトを指定することができます。たとえばStringオブジェクトのreplaceメソッドというのは、まさにStringという連想配列のreplaceプロパティの値に指定された関数のことを指しているに過ぎません。
もっともわかりやすい例は、Mathオブジェクトでしょう。
var Math = { 'E' : Math.exp(1), 'PI' : 4 * Math.atan2(1, 1), 'exp': function(x){ return Math.pow( Math.E, x ); }, /* 以下略 */ };
Object[編集]
ObjectオブジェクトはJavaScriptのオブジェクトをラップします。
var object = new Object();
JavaScriptのすべてのオブジェクトはObjectオブジェクトのインスタンスを継承します。すなわち、Object.prototypeに定義されたプロパティやメソッドは、すべてのオブジェクトから参照することができます。オブジェクトのプロパティ記述子 (property descriptor) とは、プロパティの値やプロパティが書き換え可能かどうかなどのフラグを保持するオブジェクトのことです。
プロパティ[編集]
- Objectプロトタイプオブジェクト
メソッド[編集]
- プロトタイプオブジェクトとプロパティを指定してオブジェクトを生成します。
- オブジェクトにプロパティを定義します。
- オブジェクトに複数のプロパティを定義します。
- オブジェクトのプロパティ記述子を返します。
- オブジェクトのプロトタイプを返します。
- オブジェクトの列挙可能なすべてのプロパティを配列で返します。
オブジェクトの拡張[編集]
NumberやString、Array、Objectなどの標準グローバルオブジェクトにプロパティを追加したり、既存のメソッドをオーバーライドしたりしてこれらのオブジェクトを拡張することができます。
たとえばJavaScriptの文字列はStringオブジェクトのプロトタイプであるString.prototypeに定義されたプロパティやメソッドを継承するので、これを用いるとJavaScriptの文字列からあなたが定義したプロパティを参照したり、メソッドを呼び出したりすることができます。
/* 文字列を n 回反復するメソッド */ String.prototype.repeat = function(n){ var string = this.toString(); var result = ''; for ( ; n > 0; n >>>= 1, string += string ) if ( n & 1 ) result += string; return result; }; "x".repeat(10); // "xxxxxxxxxx"
NumberやStringなどのすべてのオブジェクトはObjectオブジェクトのプロトタイプであるObject.prototypeを継承するので、Object.prototypeに定義されたプロパティやメソッドはJavaScriptの数値や文字列など、すべてのオブジェクトのインスタンスから参照することができます。
Object.prototype.print = function(){ return alert(this); }; "Hello, world!".print(); // "Hello, world!" と表示
さらにトップレベルのオブジェクト(ウェブブラウザ上のJavaScriptではwindow)もObjectオブジェクトのインスタンスを継承するので、Object.prototypeに定義されたプロパティやメソッドはグローバル変数やグローバル関数のようにトップレベルで呼び出すことができます。
Object.prototype.x = true; x; // true
for-in[編集]
for-in文はオブジェクトのプロパティを順番に取り出して反復処理します。
// 0, 1, 2 と順番にアラート var object = { "a": 0, "b": 1, "c": 2 }; for ( var key in object ) { alert( object[key] ); }
オブジェクトに属するすべてのプロパティを配列で取得するには、Object.keysメソッドを使用することができます。
// 0, 1, 2 と順番にアラート var object = { "a": 0, "b": 1, "c": 2 }; Object.keys(object).forEach(function(key){ alert( object[key] ); });
for each-in[編集]
JavaScript 1.7で追加されたfor each-in文はオブジェクトの値を順番に取り出して反復処理します。
// 0, 1, 2 と順番にアラート var object = { "a": 0, "b": 1, "c": 2 }; for each ( var value in object ) { alert(value); }