handler.set()
handler.set()
はプロパティの値を設定することに対するトラップです。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
const p = new Proxy(target, { set: function(target, property, value, receiver) { } });
引数
次の引数は set()
メソッドに渡されます。this
はハンドラーにバインドされます。
target
- ターゲットオブジェクトです。
property
- プロパティを設定する名前または
Symbol
です。 value
- 設定するプロパティの新しい値です。
receiver
-
割り当てがもともと行われていたオブジェクトです。これは通常、プロキシそのものです。しかし、
set()
ハンドラーは内部的にプロトタイプチェーンや様々な他の方法経由で呼び出されます。例: スクリプト上に
obj.name = "jen"
があり、obj
はプロキシではなく、独自の.name
プロパティを持っていません。しかし、プロトタイプチェーンでプロキシを持っています。その場合、そのプロキシのset()
ハンドラが呼ばれて、obj
は receiver として渡されます。
返値
set()
メソッドは真偽値を返します。
true
を返すと割り当てが成功したことを示します。set()
メソッドの返値がfalse
で、厳格モードで割り当てが起こった場合、TypeError
が発生します。
解説
handler.set
メソッドはプロパティの値を設定することに対するトラップです。
介入
このトラップは下記の操作に介入できます。
- プロパティの割り当て:
proxy[foo] = bar
やproxy.foo = bar
- 継承したプロパティの割り当て:
Object.create(proxy)[foo] = bar
Reflect.set()
不変条件
以下の不変条件に違反している場合、プロキシは TypeError
を発生します。
- 対応するターゲットオブジェクトのプロパティが書き込み不可かつ設定不可のデータプロパティの場合、プロパティの値と異なる値に変更することはできません。
- 対応するターゲットオブジェクトのプロパティが
[[Set]]
属性としてundefined
を持つ設定不可のアクセスプロパティの場合、プロパティの値を設定することはできません。 - 厳格モードでは、
set
ハンドラーからfalse
を返す場合、TypeError
例外をスローします。
例
プロパティ値の設定のトラップ
次のコードではプロパティの値の設定をトラップします。
const 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
仕様書
ブラウザーの互換性
BCD tables only load in the browser