このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
handler.set()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2016年9月.
handler.set() メソッドは、オブジェクトの[[Set]]内部メソッドに対するトラップであり、プロパティアクセサーを使用してプロパティの値を設定する操作に使われます。
In this article
試してみましょう
const monster = { eyeCount: 4 };const handler = { set(obj, prop, value) { if (prop === "eyeCount" && value % 2 !== 0) { console.log("Monsters must have an even number of eyes"); } else { return Reflect.set(...arguments); } },};const proxy = new Proxy(monster, handler);proxy.eyeCount = 1;// 予想される結果: "Monsters must have an even number of eyes"console.log(proxy.eyeCount);// 予想される結果: 4proxy.eyeCount = 2;console.log(proxy.eyeCount);// 予想される結果: 2構文
js
new Proxy(target, { set(target, property, value, receiver) { }})引数
次の引数はset() メソッドに渡されます。this はハンドラーにバインドされます。
返値
set() メソッドは、代入が成功したかどうかを示す論理値 (Boolean) を返す必要があります。それ以外の値は論理値に変換されます。
多くの操作(厳格モード でのプロパティアクセサーの使用が含まれます)は、[[Set]] 内部メソッドがfalse を返した場合、TypeError が発生します。
解説
>介入
このトラップは下記の操作に介入できます。
- プロパティへの代入:
proxy[foo] = barやproxy.foo = bar Reflect.set()
他にも、[[Set]]内部メソッドを呼び出すあらゆる操作に介入できます。
不変条件
プロキシーの[[Set]] 内部メソッドにおいて、ハンドラーの定義が次のいずれかの不変条件に違反する場合、TypeError が発生します。
- プロパティの値が、対応する対象とするオブジェクトのプロパティの値と異なる値に変更できません。ただし、対応する対象とするオブジェクトのプロパティが、書き込み不可かつ構成不可の自分自身でデータプロパティである場合に限ります。つまり、
Reflect.getOwnPropertyDescriptor()がtargetのプロパティに対してconfigurable: false, writable: falseを返す場合、かつvalueがtargetのプロパティ記述子内のvalue属性と異なる場合、トラップは偽値を返す必要があります。 - 対応する対象オブジェクトのプロパティが、設定不可の自己アクセサープロパティであり、そのセッターが未定義で設定されている場合、そのプロパティの値を設定できません。つまり、
Reflect.getOwnPropertyDescriptor()がtargetのプロパティに対してconfigurable: false, set: undefinedを返す場合、トラップは偽値を返す必要があります。
例
>プロパティ値の設定のトラップ
次のコードではプロパティの値の設定をトラップします。
js
const p = new Proxy( {}, { set(target, prop, value, receiver) { target[prop] = value; console.log(`property set: ${prop} = ${value}`); return true; }, },);console.log("a" in p); // falsep.a = 10; // "property set: a = 10"console.log("a" in p); // trueconsole.log(p.a); // 10仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver> |