set 構文は、オブジェクトプロパティに対して、値を設定しようとするときに呼び出される関数を割り当てます。
構文
{set prop(val) { . . . }}
{set [expression](val) { . . . }}
引数
prop- 与えられた関数を割り当てるプロパティの名称です。
valpropに設定しようとする値を保持する変数のエイリアスです。- 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
deleteObject.defineProperty()__defineGetter____defineSetter__- ゲッターとセッターの定義 (JavaScript ガイド)