set 構文は、オブジェクトプロパティに対して、値を設定しようとするときに呼び出される関数を割り当てます。

構文

{set prop(val) { . . . }}
{set [expression](val) { . . . }}

引数

prop
与えられた関数を割り当てるプロパティの名称です。
val
prop に設定しようとする値を保持する変数のエイリアスです。
expression
ECMAScript 6 より、算出されたプロパティ名 (computed property name) の式を使用して関数に結び付けることもできます。

説明

JavaScript では、特定のプロパティを変更しようとするたびに関数を実行するため、setter を利用できます。setter はたいてい getter と合わせて、擬似的なプロパティを作成するために用いられます。実際の値を持つプロパティが、同時に setter を持つことはできません。

set 構文を使用する際の注意事項:

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 Latest Draft (ECMA-262)
Method definitions の定義
ドラフト  

ブラウザ実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 1Edge 完全対応 ありFirefox 完全対応 2IE 完全対応 9Opera 完全対応 9.5Safari 完全対応 3WebView Android 完全対応 1Chrome Android 完全対応 18Edge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり
Computed property namesChrome 完全対応 46Edge 完全対応 ありFirefox 完全対応 34IE 未対応 なしOpera 完全対応 47Safari 未対応 なしWebView Android 完全対応 46Chrome Android 完全対応 46Edge Mobile 完全対応 ありFirefox Android 完全対応 34Opera Android 完全対応 ありSafari iOS 未対応 なしSamsung Internet Android 完全対応 5.0nodejs 完全対応 あり

凡例

完全対応  
完全対応
未対応  
未対応

SpiderMonkey に関する注記

  • JavaScript 1.8.1 より、オブジェクトや配列のイニシャライザでプロパティを設定する際に、setter は呼び出されません。
  • SpiderMonkey 38 より ES6 仕様に従い、rest parameter を持つ setter は SyntaxError が発生します。

関連情報

ドキュメントのタグと貢献者

このページの貢献者: Shimono, SphinxKnight, yyss, teoli, ethertank
最終更新者: Shimono,