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]] の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応491218 なし3610
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応4949 あり1836105.0

関連情報

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

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