handler.set()
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2016å¹´9æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
handler.set() ã¡ã½ããã¯ããªãã¸ã§ã¯ãã® [[Set]] å
é¨ã¡ã½ããã«å¯¾ãããã©ããã§ãããããããã£ã¢ã¯ã»ãµã¼ã使ç¨ãã¦ããããã£ã®å¤ãè¨å®ããæä½ã«ä½¿ããã¾ãã
試ãã¦ã¿ã¾ããã
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);
// äºæ³ãããçµæ: 4
proxy.eyeCount = 2;
console.log(proxy.eyeCount);
// äºæ³ãããçµæ: 2
æ§æ
new Proxy(target, {
set(target, property, value, receiver) {
}
})
弿°
次ã®å¼æ°ã¯ set() ã¡ã½ããã«æ¸¡ããã¾ããthis ã¯ãã³ãã©ã¼ã«ãã¤ã³ãããã¾ãã
target-
ã¿ã¼ã²ãããªãã¸ã§ã¯ãã§ãã
property-
æååã¾ãã¯
Symbolã§ãããããã£åã表ãã¾ãã value-
è¨å®ããããããã£ã®æ°ããå¤ã§ãã
receiver-
ã»ãã¿ã¼ã®
thiså¤ãReflect.set()ãåç §ãããã¯é常ããããã·ã¼èªä½ã¾ãã¯ãããã·ã¼ããç¶æ¿ãããªãã¸ã§ã¯ãã§ãã
è¿å¤
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ãè¿ãå ´åããã©ããã¯å½å¤ãè¿ãå¿ è¦ãããã¾ãã
ä¾
>ããããã£å¤ã®è¨å®ã®ãã©ãã
次ã®ã³ã¼ãã§ã¯ããããã£ã®å¤ã®è¨å®ããã©ãããã¾ãã
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); // false
p.a = 10; // "property set: a = 10"
console.log("a" in p); // true
console.log(p.a); // 10
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver > |