set
構文は、オブジェクトプロパティに対して、値を設定しようとするときに呼び出される関数を割り当てます。
構文
{set prop(val) { . . . }} {set [expression](val) { . . . }}
引数
prop
- 与えられた関数を割り当てるプロパティの名称です。
val
prop
に設定しようとする値を保持する変数のエイリアスです。- expression
- ECMAScript 6 より、算出されたプロパティ名 (computed property name) の式を使用して関数に結び付けることもできます。
説明
JavaScript では、特定のプロパティを変更しようとするたびに関数を実行するため、setter を利用できます。setter はたいてい getter と合わせて、擬似的なプロパティを作成するために用いられます。実際の値を持つプロパティが、同時に setter を持つことはできません。
set
構文を使用する際の注意事項:
- 数値か文字列かの識別子を持つことができます。
- 厳密に 1 つの引数を持たなければなりません (詳しくは Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments をご覧ください)。
- 同一のプロパティに別の
set
あるいはデータエントリを持つオブジェクトリテラルが現れてはいけません。
( ※{ set x(v) { }, set x(v) { } }
および{ x: ..., set x(v) { } }
は不可 )
setter は delete
演算子を用いて削除できます。
例
オブジェクトの初期化時に新しいオブジェクトで setter を定義する
ここではオブジェクト o
に疑似プロパティ current
を定義して、値が設定されたときに log
をその値で更新します:
var o = { set current (str) { this.log[this.log.length] = str; }, log: [] }
current
は定義されておらず、あらゆるアクセスを試みてもその結果は undefined
になることに注意してください。
delete
演算子による setter の削除
setter を削除したい場合は、delete
を使用します:
delete o.current;
defineProperty
を使用して既存のオブジェクトに setter を定義する
任意のタイミングで既存のオブジェクトに setter を追加するには、Object.defineProperty()
を使用します。
var o = { a:0 }; Object.defineProperty(o, "b", { set: function (x) { this.a = x / 2; } }); o.b = 10; // setter を実行。プロパティ 'a' に 10 / 2 (5) を代入 console.log(o.a) // 5
算出されたプロパティ名を使用する
注記: プロパティ名の算出は ECMAScript 6 の提案に含まれる実験的な技術であり、まだブラウザで広くはサポートされていません。非サポート環境では構文エラーが発生します。
var expr = "foo"; var obj = { baz: "bar", set [expr](v) { this.baz = v; } }; console.log(obj.baz); // "bar" obj.foo = "baz"; // setter を実行 console.log(obj.baz); // "baz"
仕様
仕様書 | 策定状況 | コメント |
---|---|---|
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 | 未サポート | 34 (34) | 未サポート | 未サポート | 未サポート |
機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本サポート | (有) | (有) | 1.0 (1.8.1) | (有) | (有) | (有) |
Computed property names | 未サポート | 未サポート | 34.0 (34.0) | 未サポート | 未サポート | 未サポート |
SpiderMonkey に関する注記
- JavaScript 1.8.1 より、オブジェクトや配列のイニシャライザでプロパティを設定する際に、setter は呼び出されません。
- SpiderMonkey 38 より ES6 仕様に従い、rest parameter を持つ setter は
SyntaxError
が発生します。
関連情報
- getter
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- ゲッターとセッターの定義 (JavaScript ガイド)