get 構文は、オブジェクトのプロパティを、プロパティが参照された時に関数が呼び出されるように結びつけます。
構文
{get prop() { ... } }
{get [expression]() { ... } }
引数
prop- 与えられた関数に結び付けられるプロパティの名前
- expression
- ECMAScript 6 より、算出されたプロパティ名 (computed property name) の式を使用して関数に結び付けることもできます。
説明
時として、動的に計算した値を返すプロパティにアクセスを許可したほうが望ましい場合や、明示的なメソッドを呼び出すことなく内部変数の状態を反映させたいときがあります。Javascriptでは、getterを使ってこれを行うことが可能です。プロパティのタイプを作るのと同時にgetterとsetterを使うことは可能ですが、getterにプロパティ自身とそれが持つ値を同時に返させることはできません。
get 構文を使用する際の注意事項:
- 数値または文字列による識別子を持つことができます。
- パラメータの数は 0 でなければなりません (詳しくは Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments をご覧ください)。
- 1つのオブジェクトリテラル中に、同じプロパティに対する別の
getまたはデータの割り当てが現れてはいけません ({ get x() { }, get x() { } }や{ x: ..., get x() { } }は禁止されています)。
getterは delete 演算子で削除することができます。
例
オブジェクトの初期化時に新しいオブジェクトで getter を定義する
以下の例では、オブジェクト obj の疑似的なプロパティとして、log 内の最後の配列アイテムを返す latest プロパティを作成します。
var log = ['test'];
var obj = {
get latest () {
if (log.length == 0) return undefined;
return log[log.length - 1]
}
}
console.log (obj.latest); // Will return "test".
latest に値を代入しようとしても、変更はされないことに注意して下さい。
delete 演算子によるgetterの削除
getter を削除したい場合は、delete を使用します:
delete obj.latest;
defineProperty を使用して既存のオブジェクトに getter を定義する
任意のタイミングで既存のオブジェクトに getter を追加するには、Object.defineProperty() を使用します。
var o = { a:0 }
Object.defineProperty(o, "b", { get: function () { return this.a + 1; } });
console.log(o.b) // getter を実行。a + 1 を算出する (結果は 1)
算出されたプロパティ名を使用する
注記: プロパティ名の算出は ECMAScript 6 の提案に含まれる実験的な技術であり、まだブラウザで広くはサポートされていません。非サポート環境では構文エラーが発生します。
var expr = "foo";
var obj = {
get [expr]() { return "bar"; }
};
console.log(obj.foo); // "bar"
スマート / 自己書き換え / 怠惰な getter
getters はオブジェクトのプロパティを定義する手段を提供しますが、アクセスされるまでプロパティの値を計算しません。getter は値を計算するコストを、値が必要になるまで先送りしています。また値が必要でなければ、そのコストを負担しません。
プロパティの値の計算を先送りしたり後のアクセスのためにキャッシュするための付加的な最適化技術が、スマート getter または メモ化 getter です。初めて getter にアクセスされたときに、値を計算してキャッシュします。以降のアクセスでは再計算せずに、キャッシュした値を返します。これは以下の状況で役に立ちます:
- プロパティの値の計算コストが高い場合 (大量の RAM や CPU 時間を使用する、Worker スレッドを生成する、リモートのファイルを読み込むなど)。
- 値がすぐに必要ではない場合。値を後で使用する、あるいはまったく使用しない場合がある状況。
- 何度もアクセスされる値で、値が変更されないため再計算の必要がない、あるいは再計算すべきではない場合。
値が変わると見込まれるプロパティで、怠惰な getter を使用してはいけません。このような getter は値を再計算しないためです。
以下の例では、オブジェクトが自身のプロパティとして getter を持っています。プロパティを取得すると、プロパティはオブジェクトから削除された後に再追加されますが、このとき暗黙的にデータプロパティとして追加されます。最終的に、値が返されます。
get notifier() {
delete this.notifier;
return this.notifier = document.getElementById("bookmarked-notification-anchor");
},
Firefox のコードでは、XPCOMUtils.jsm コードモジュールもご覧ください。これは defineLazyGetter() 関数を定義しています。
仕様
| 仕様書 | 策定状況 | コメント |
|---|---|---|
| ECMAScript 5.1 (ECMA-262) Object Initializer の定義 |
標準 | 最初期の定義 |
| ECMAScript 2015 (6th Edition, ECMA-262) Method definitions の定義 |
標準 | computed property names を追加。 |
| ECMAScript 2017 Draft (ECMA-262) Method definitions の定義 |
ドラフト |
ブラウザ実装状況
| 機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| 基本サポート | 1 | 2.0 (1.8.1) | 9 | 9.5 | 3 |
| Computed property names | 46 | 34 (34) | 未サポート | 未サポート | 未サポート |
| 機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | 1.0 (1.8.1) | (有) | (有) | (有) |
| Computed property names | 47 | 未サポート | 34.0 (34.0) | 未サポート | 未サポート | 未サポート |
関連情報
- setter
deleteObject.defineProperty()__defineGetter____defineSetter__- ゲッターとセッターの定義 (JavaScript ガイド)