handler.set() はプロパティの値を設定することに対するトラップです。

構文

var p = new Proxy(target, {
  set: function(target, property, value, receiver) {
  }
});

引数

次の引数は set メソッドに渡されます。this はハンドラにバインドされます。

target
ターゲットオブジェクトです。
property
設定するプロパティ名です。
value
設定するプロパティの新しい値です。
receiver
割り当てがもともと行われていたオブジェクトです。これは通常、プロキシそのものです。しかし、set ハンドラは内部的にプロトタイプチェーンや様々な他の方法経由で呼ばれます。
例えば、スクリプト上に obj.name = "jen" があり、obj はプロキシではなく、独自の name プロパティを持っていません。しかし、プロトタイプチェーンでプロキシを持っています。その場合、そのプロキシの set ハンドラが呼ばれて、obj は receiver として渡されます。

戻り値

set メソッドは真偽値を返します。割り当てが成功したことを示すために true を返します。set メソッドの戻り値が false で、strict モードで割り当てが起こった場合、TypeError がスローされます。

説明

handler.set メソッドはプロパティの値を設定することに対するトラップです。

インターセプト

このトラップは下記の操作をインターセプトします。:

  • プロパティの割り当て: proxy[foo] = barproxy.foo = bar
  • 継承したプロパティの割り当て: Object.create(proxy)[foo] = bar
  • Reflect.set()

不変条件

次の不変条件に違反している場合、プロキシは TypeError をスローします。:

  • 対応するターゲットオブジェクトのプロパティが書き込み不可かつ設定不可のデータプロパティの場合、プロパティの値と異なる値に変更することはできません。
  • 対応するターゲットオブジェクトのプロパティが[[Set]]属性として undefined を持つ設定不可のアクセスプロパティの場合、プロパティの値を設定することはできません。
  • strict モードでは、 set ハンドラから false を返す場合、TypeError 例外をスローします。

次のコードではプロパティの値の設定をトラップします。

var p = new Proxy({}, {
  set: function(target, prop, value, receiver) {
    target[prop] = value;
    console.log('property set: ' + prop + ' = ' + value);
    return true;
  }
});

console.log('a' in p); // false

p.a = 10;              // "property set: a = 10"
console.log('a' in p); // true
console.log(p.a);      // 10

仕様

仕様 状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
[[Set]] の定義
標準 初期定義
ECMAScript Latest Draft (ECMA-262)
[[Set]] の定義
ドラフト  

ブラウザ実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 49Edge 完全対応 12Firefox 完全対応 18IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Edge Mobile 完全対応 ありFirefox Android 完全対応 18Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0

凡例

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

関連情報

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

このページの貢献者: segayuu, SphinxKnight, shide55
最終更新者: segayuu,