Proxy
ããã³ Reflect
ãªãã¸ã§ã¯ãã«ãããåºæ¬çãªè¨èªæä½ (ä¾ãã°ãããããã£åç
§ã代å
¥ãåæã颿°å¼ã³åºããªã©) ã«å²ãè¾¼ã¿ãåä½ãã«ã¹ã¿ãã¤ãºãããã¨ãã§ãã¾ãããã® 2 ã¤ã®ãªãã¸ã§ã¯ãã®ãããã§ã JavaScript ã§ã¡ã¿ã¬ãã«ã®ããã°ã©ãã³ã°ãè¡ãã¾ãã
Proxy
ãªãã¸ã§ã¯ãã«ãã£ã¦ãç¹å®ã®æä½ã«å²ãè¾¼ãã§åä½ãã«ã¹ã¿ãã¤ãºãããã¨ãã§ãã¾ãã
ä¾ãã°ããªãã¸ã§ã¯ãã®ããããã£ãåå¾ãã¦ã¿ã¾ãããã
const handler = {
get(target, name) {
return name in target ? target[name] : 42;
},
};
const p = new Proxy({}, handler);
p.a = 1;
console.log(p.a, p.b); // 1, 42
ãã® Proxy
ãªãã¸ã§ã¯ã㯠target
(ããã§ã¯ç©ºãªãã¸ã§ã¯ã) 㨠handler
ãªãã¸ã§ã¯ããå®ç¾©ãããã®ä¸ã« get
ãã©ãããå®è£
ããã¦ãã¾ããããã§ããããã·ã¼ã¨ãªã£ããªãã¸ã§ã¯ãã¯æªå®ç¾©ã®ããããã£ãåå¾ãããã¨ããæã« undefined
ãè¿ããã代ããã«æ°å¤ 42
ãè¿ãã¾ãã
ãã以å¤ã®ä¾ã¯ Proxy
ã®ãªãã¡ã¬ã³ã¹ãã¼ã¸ãåç
§ãã¦ãã ããã
ãããã·ã¼ã®æ©è½ã«ã¤ãã¦è©±é¡ã«ããéã¯ã次ã®ç¨èªã使ç¨ããã¾ãã
ãã©ãããå ¥ããããã®ãã¬ã¼ã¹ãã«ãç¨ãªãã¸ã§ã¯ãã
ããããã£ã¸ã®ã¢ã¯ã»ã¹ãæä¾ããã¡ã½ããã§ãã (ãªãã¬ã¼ãã£ã³ã°ã·ã¹ãã ã«ããããã©ããã®æ¦å¿µã¨åããããªãã®ã§ãã)
ãããã·ã¼ãä»®æ³åãããªãã¸ã§ã¯ãã§ããå¤ãã®å ´åããããã·ã¼ã®ã¹ãã¬ã¼ã¸ããã¯ã¨ã³ãã¨ãã¦ä½¿ç¨ããã¾ããæ¡å¼µãè¨å®ã§ããªããªãã¸ã§ã¯ãã®ããããã£ã®ä¸å¤æ¡ä»¶ï¼å¤æ´ãããªãæå³ï¼ãã¿ã¼ã²ããã«å¯¾ãã¦æ¤è¨¼ããã¾ãã
ç¬èªã®æä½ãå®è£
ããéã«å¤æ´ãããªãæå³ãä¸å¤æ¡ä»¶ã¨å¼ã³ã¾ãããã³ãã©ã¼ã®ä¸å¤æ¡ä»¶ã«éåããå ´åã TypeError
ãçºçãã¾ãã
次ã®è¡¨ã¯ã Proxy
ãªãã¸ã§ã¯ãã«å¯¾ãã¦å©ç¨å¯è½ãªãã©ãããã¾ã¨ãããã®ã§ãã詳細ãªèª¬æã¨ä¾ã«ã¤ãã¦ã¯ããªãã¡ã¬ã³ã¹ãã¼ã¸ãåç
§ãã¦ãã ããã
Proxy
Proxy.revocable()
ã¡ã½ããã¯åãæ¶ãå¯è½ãª Proxy
ãªãã¸ã§ã¯ãã®çæã«ä½¿ç¨ããã¾ããããã«ããããããã·ã¼ã revoke
颿°ã§åãæ¶ãããããã·ã¼ã®æ©è½ã忢ãããã¨ãã§ãã¾ãã
ãã®å¾ã¯ãããã·ã¼ãéãããããªãæä½ã TypeError
ã«ãªãã¾ãã
const revocable = Proxy.revocable(
{},
{
get(target, name) {
return `[[${name}]]`;
},
},
);
const proxy = revocable.proxy;
console.log(proxy.foo); // "[[foo]]"
revocable.revoke();
console.log(proxy.foo); // TypeError: Cannot perform 'get' on a proxy that has been revoked
proxy.foo = 1; // TypeError: Cannot perform 'set' on a proxy that has been revoked
delete proxy.foo; // TypeError: Cannot perform 'deleteProperty' on a proxy that has been revoked
console.log(typeof proxy); // "object" ãè¿ãã, typeof ã¯ã©ããªãã©ãããå¼ãèµ·ãããªã
ãªãã¬ã¯ã·ã§ã³
Reflect
㯠JavaScript ã§å²ãè¾¼ã¿æä½ãè¡ãã¡ã½ãããæä¾ããçµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã§ãããã®ã¡ã½ããã¯ãããã·ã¼ã®ãã³ãã©ã¼ã®ã¡ã½ããã¨åãã§ãã
Reflect
ã¯é¢æ°ãªãã¸ã§ã¯ãã§ã¯ããã¾ããã
Reflect
ã¯ãã³ãã©ã¼ããã¿ã¼ã²ãã
ã¸ã®æ¢å®ã®æä½ã転éããã®ã«å½¹ç«ã¡ã¾ãã
ä¾ãã°ãReflect.has()
ã使ãã°ã in
æ¼ç®åã颿°ã¨ãã¦ä½¿ããã¨ãã§ãã¾ãã
Reflect.has(Object, "assign"); // true
ããåªãã apply() 颿°
Reflect
ãç»å ´ããåã¯ãæå®ã® this
å¤ã¨é
åãé
å風ãªãã¸ã§ã¯ãã¨ãã¦æä¾ããã arguments
ã使ã£ã¦é¢æ°ãå¼ã³åºã Function.prototype.apply()
ã¡ã½ããããã使ããã¦ãã¾ããã
Function.prototype.apply.call(Math.floor, undefined, [1.75]);
Reflect.apply
ã使ãã°ãããç°¡æ½ã§åããããããã®ã«ã§ãã¾ãã
Reflect.apply(Math.floor, undefined, [1.75]);
// 1
Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]);
// "hello"
Reflect.apply(RegExp.prototype.exec, /ab/, ["confabulation"]).index;
// 4
Reflect.apply("".charAt, "ponies", [3]);
// "i"
ããããã£å®ç¾©ã®æå¦ãã§ãã¯
Object.defineProperty
ã¯æåããã°ãªãã¸ã§ã¯ããè¿ããããã§ãªããã° TypeError
ãçºçããã®ã§ã try...catch
ãããã¯ã使ã£ã¦ãããããã£ã®å®ç¾©ä¸ã«çºçããã¨ã©ã¼ãææãã¾ããReflect.defineProperty()
ã¯æåã®ã¹ãã¼ã¿ã¹ãè«çå¤ã§è¿ãã®ã§ãããã§ã¯ if...else
ãããã¯ã使ãã ãã§ããã®ã§ãã
if (Reflect.defineProperty(target, property, attributes)) {
// æåããæã®å¦ç
} else {
// 失æããæã®å¦ç
}
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4