Baseline Widely available
Proxy
ãªãã¸ã§ã¯ãã«ããå¥ãªãªãã¸ã§ã¯ãã®ãããã·ã¼ã使ãããã¨ãã§ãããã®ãªãã¸ã§ã¯ãã®åºæ¬çãªæä½ã«ä»å
¥ãããåå®ç¾©ããããããã¨ãã§ãã¾ãã
Proxy
ãªãã¸ã§ã¯ãã¯ãå
ã®ãªãã¸ã§ã¯ãã®ä»£ããã«ä½¿ç¨ã§ãããªãã¸ã§ã¯ãã使ãããã¨ãã§ãã¾ãããããããã£ã®åå¾ãè¨å®ãå®ç¾©ãªã©ã®åºæ¬ç㪠Object
æä½ãåå®ç¾©ãããã¨ãã§ãã¾ãããããã·ã¼ãªãã¸ã§ã¯ãã¯ä¸è¬çã«ãããããã£ã¢ã¯ã»ã¹ã®ãã°ãåã£ãããå
¥åã®æ¤è¨¼ãæ¸å¼åããµãã¿ã¤ãºãè¡ã£ããããã®ã«ä½¿ç¨ããã¾ãã
Proxy
㯠2 ã¤ã®å¼æ°ã§ä½æããã¾ãã
target
: ãããã·ã¼ãè¨å®ããå
ã®ãªãã¸ã§ã¯ãã§ããhandler
: ã©ã®æä½ã«ä»å
¥ããããã¾ãä»å
¥ãããæä½ãã©ã®ããã«åå®ç¾©ããããå®ç¾©ãããªãã¸ã§ã¯ãã§ããä¾ãã°ããã®ã³ã¼ã㯠target
ãªãã¸ã§ã¯ãã®ãããã·ã¼ã使ãã¾ãã
const target = {
message1: "hello",
message2: "everyone",
};
const handler1 = {};
const proxy1 = new Proxy(target, handler1);
ãã³ãã©ã¼ã¯ç©ºãªã®ã§ããã®ãããã·ã¼ã¯å ã®ã¿ã¼ã²ããã¨åæ§ã«åä½ãã¾ãã
console.log(proxy1.message1); // hello
console.log(proxy1.message2); // everyone
ãããã·ã¼ãã«ã¹ã¿ãã¤ãºããã«ã¯ããã³ãã©ã¼ãªãã¸ã§ã¯ãã«é¢æ°ãå®ç¾©ãã¾ãã
const target = {
message1: "hello",
message2: "everyone",
};
const handler2 = {
get(target, prop, receiver) {
return "world";
},
};
const proxy2 = new Proxy(target, handler2);
ããã§ get()
ãã³ãã©ã¼ãå®è£
ããã¿ã¼ã²ããã®ããããã£ã¸ã®ã¢ã¯ã»ã¹ã«ä»å
¥ãã¾ãã
ãã³ãã©ã¼é¢æ°ã¯ãã©ããã¨å¼ã°ãããã¨ãããã¾ãããããã¯ããããã¿ã¼ã²ãããªãã¸ã§ã¯ãã¸ã®å¼ã³åºãããã©ããããããã§ããããä¸è¨ã® handler2
ã®ã¨ã¦ãåç´ãªãã©ããã¯ããã¹ã¦ã®ããããã£ã¢ã¯ã»ãµã¼ãåå®ç¾©ãã¾ãã
console.log(proxy2.message1); // world
console.log(proxy2.message2); // world
ãããã·ã¼ã¯ Reflect
ãªãã¸ã§ã¯ãã¨å
±ã«ä½¿ç¨ããããã¨ãå¤ãããã®ãªãã¸ã§ã¯ã㯠Proxy
ãã©ããã¨åãååã®ã¡ã½ãããããã¤ãæä¾ãã¦ãã¾ããReflect
ã¡ã½ããã¯ã対å¿ãããªãã¸ã§ã¯ãå
é¨ã¡ã½ãããå¼ã³åºãããã®åå°çãªæå³ã¥ããæä¾ãããã®ã§ããä¾ã¨ãã¦ããªãã¸ã§ã¯ãã®åä½ãåå®ç¾©ããããªãå ´åãæ¬¡ã®ããã« Reflect.get
ãå¼ã³åºããã¨ãã§ãã¾ãã
const target = {
message1: "hello",
message2: "everyone",
};
const handler3 = {
get(target, prop, receiver) {
if (prop === "message2") {
return "world";
}
return Reflect.get(...arguments);
},
};
const proxy3 = new Proxy(target, handler3);
console.log(proxy3.message1); // hello
console.log(proxy3.message2); // world
Reflect
ã¡ã½ããã¯ããªãã¸ã§ã¯ãã®å
é¨ã¡ã½ãããéãã¦ãªãã¸ã§ã¯ãã¨ããã¨ããããã¨ã«å¤ããã¯ããã¾ããããããã·ã¼ä¸ã§å¼ã³åºããã¦ãããããã·ã¼ããè±ãããã·ã¼ããããã¨ã¯ããã¾ããããããã·ã¼ãã©ããå
ã§ Reflect
ã¡ã½ããã使ç¨ããReflect
ã¡ã½ããå¼ã³åºããåã³ãã©ããã«ä»å
¥ããå ´åãç¡éã®å帰ãçºçããå¯è½æ§ãããã¾ãã
ãããã·ã¼ã®æ©è½ã«ã¤ãã¦èªãã¨ãã以ä¸ã®ç¨èªã使ç¨ããã¾ãã
Proxy
ã³ã³ã¹ãã©ã¯ã¿ã¼ã® 2 ã¤ç®ã®å¼æ°ã¨ãã¦æ¸¡ããããªãã¸ã§ã¯ãããããã·ã¼ã®åä½ãå®ç¾©ãããã©ãããæ ¼ç´ããã¦ãã¾ãã
対å¿ãããªãã¸ã§ã¯ãå é¨ã¡ã½ããã®æ¯ãèããå®ç¾©ãã颿°ã§ããï¼ããã¯ããªãã¬ã¼ãã£ã³ã°ã·ã¹ãã ã«ãããããã©ãããã®æ¦å¿µã«ä¼¼ã¦ãã¾ããï¼
ãããã·ã¼ãä»®æ³åãããªãã¸ã§ã¯ãããããã·ã¼ã®ã¹ãã¬ã¼ã¸ããã¯ã¨ã³ãã¨ãã¦å¤ã使ç¨ããã¾ãããªãã¸ã§ã¯ãã®éæ¡å¼µæ§ã¾ãã¯è¨å®ä¸å¯è½ãªããããã£ã«é¢ããã¤ã³ããªã¢ã³ãï¼å¤æ´ãããªãæå³ã¥ãï¼ã¯ã対象ã«å¯¾ãã¦æ¤è¨¼ããã¾ãã
ã«ã¹ã¿ã å¦çãå®è£
ãã¦ãå¤ãããªãæå³ã¥ãããã©ããã®å®è£
ããã³ãã©ã¼ã®ä¸å¤æ¡ä»¶ã«éåããå ´åãTypeError
ãçºçãã¾ãã
ãªãã¸ã§ã¯ãã¯ããããã£ã®éåä½ã§ãããããããã®è¨èªã§ã¯ããªãã¸ã§ã¯ãã«æ ¼ç´ããããã¼ã¿ãç´æ¥æä½ããããã®ä»çµã¿ã¯æä¾ããã¦ãã¾ããããããããªãã¸ã§ã¯ãã¯ããªãã¸ã§ã¯ãã¨å¯¾è©±ããæ¹æ³ãæå®ããããã¤ãã®å
é¨ã¡ã½ãããå®ç¾©ãã¾ããä¾ãã°ãobj.x
ãèªãã ã¨ãã以ä¸ã®ãããªãã¨ãèµ·ããã¨äºæ³ããã¾ãã
x
ããããã£ã¯ãå¾ãããã¾ã§ãããã¿ã¤ããã§ã¼ã³ãæ¤ç´¢ããããx
ããã¼ã¿ããããã£ã®å ´åãããããã£è¨è¿°åã® value
屿§ãè¿ããããx
ãã¢ã¯ã»ãµããããã£ã®å ´åãã²ãã¿ã¼ãå¼ã³åºãã¨ãã²ãã¿ã¼ã®è¿å¤ãè¿ããããè¨èªä¸ããã®å¦çã«ã¤ãã¦ç¹å¥ãªãã¨ã¯ä½ãããã¾ãããæ¢å®ã§ã¯ãæ®éã®ãªãã¸ã§ã¯ãããã®åä½ã§å®ç¾©ããã [[Get]]
å
é¨ã¡ã½ãããæã£ã¦ããããã«ä»ãªãã¾ãããobj.x
ããããã£ã¢ã¯ã»ã¹æ§æã¯ãåã«ãªãã¸ã§ã¯ãã® [[Get]]
ã¡ã½ãããå¼ã³åºãã ãã§ããªãã¸ã§ã¯ãã¯èªåèªèº«ã§å
é¨ã¡ã½ããã®å®è£
ã使ç¨ãã¦ãè¿ãå¤ã決å®ãã¾ãã
å¥ã®ä¾ã¨ãã¦ãé
åã¯é常ã®ãªãã¸ã§ã¯ãã¨ç°ãªããéæ³ã®length
ããããã£ãããã夿´ããã¨èªåçã«ç©ºã®ã¹ãããã«å²ãå½ã¦ããããé
åã®è¦ç´ ãåé¤ããã¾ããåæ§ã«ãé
åã®è¦ç´ ã追å ããã¨ãèªåçã« length
ããããã£ã夿´ããã¾ããããã¯ãé
åã«ã¯ [[DefineOwnProperty]]
ã¨ããå
é¨ã¡ã½ããããããããããæ´æ°ã®æ·»åã®ä½ç½®ã«æ¸ãè¾¼ã¿ãè¡ãããã¨ãã« length
ãæ´æ°ããããlength
ãæ¸ãè¾¼ã¾ããã¨ãã«é
åã®å
å®¹ãæ´æ°ãããããã¨ãããã¨ãç¥ã£ã¦ããããã§ãããã®ãããªãé常ã®ãªãã¸ã§ã¯ãã¨ã¯ç°ãªãå®è£
ãæã¤å
é¨ã¡ã½ãããæã¤ãªãã¸ã§ã¯ãã¯ãã¨ãã¾ããã¯ãªãã¸ã§ã¯ã ã¨å¼ã°ãã¾ãããããã·ã¼ãªãã¸ã§ã¯ãã¯ãèªåèªèº«ã§ã¨ãã¾ããã¯ãªãã¸ã§ã¯ããå®ç¾©ãããã¨ãã§ãã¾ãã
ãã¹ã¦ã®ãªãã¸ã§ã¯ãã¯ã以ä¸ã®å é¨ã¡ã½ãããä¿æãã¦ãã¾ãã
ã¾ãã颿°ãªãã¸ã§ã¯ãã¯ä»¥ä¸ã®å é¨ã¡ã½ãããä¿æãã¾ãã
ãªãã¸ã§ã¯ãã¨ããã¨ããããã®ã¯ãã¹ã¦ãæçµçã«ã¯ãããã®å
é¨ã¡ã½ããã®å¼ã³åºãã«å¸°çµãããããã¯ãã¹ã¦ãããã·ã¼ã«ãã£ã¦ã«ã¹ã¿ãã¤ãºå¯è½ã§ãããã¨ãçè§£ãããã¨ã¯éè¦ã§ããã¤ã¾ããã»ã¼ãã¹ã¦ã®åä½ãï¼ããéè¦ãªä¸å¤æ¡ä»¶ãé¤ãã¦ï¼è¨èªã§ä¿è¨¼ããã¦ããããã§ã¯ãªãããã¹ã¦ããªãã¸ã§ã¯ãèªèº«ã«ãã£ã¦å®ç¾©ãããã®ã§ããdelete obj.x
ãå®è¡ããã¨ãããã®å¾ "x" in obj
ã false
ãä¿è¨¼ãã¦ããããã§ã¯ããã¾ãããããã¯ãªãã¸ã§ã¯ãã® [[Delete]]
㨠[[HasProperty]]
ã®å®è£
ã«ä¾åãã¾ããdelete obj.x
ã¯ã³ã³ã½ã¼ã«ã«ãã°åºåããããã°ãã¼ãã«ããããã£ã夿´ãããããããã¯æ¢åã®ããããã£ãåé¤ãã代ããã«æ°ããããããã£ãå®ç¾©ãããã¨ãã§ãã¾ããããããã®æå³ã¥ãã¯èªåã®ã³ã¼ãã§ã¯é¿ããã¹ãã§ãããã
å
é¨ã¡ã½ããã¯ãã¹ã¦è¨èªèªèº«ã«ãã£ã¦å¼ã³åºããããã®ã§ãããJavaScript ã³ã¼ãã§ç´æ¥ã¢ã¯ã»ã¹ãããã¨ã¯ã§ãã¾ãããReflect
åå空éã¯ãããã¤ãã®å
¥åæ£è¦å/æ¤è¨¼ã®ä»ã«ãå
é¨ã¡ã½ãããå¼ã³åºã以ä¸ã®ãã¨ã¯ã»ã¨ãã©ããªãã¡ã½ãããæä¾ãã¦ãã¾ããããããã®ãã©ããã®ãã¼ã¸ã§ã¯ããã©ãããå¼ã³åºã代表çãªå ´é¢ãããã¤ãæãã¦ãã¾ããããããã®å
é¨ã¡ã½ããã¯ãå¤ãã®å ´æã§å¼ã³åºããã¾ããä¾ãã°ãé
åã¡ã½ããã¯ãããã®å
é¨ã¡ã½ãããéãã¦é
åã«èªã¿æ¸ãããã®ã§ãpush()
ãªã©ã®ã¡ã½ãã㯠get()
ã set()
ãã©ãããå¼ã³åºãã¾ãã
å
é¨ã¡ã½ããã®ã»ã¨ãã©ã¯ãä½ããããã¯ç°¡åã§ããæ··ä¹±ããããªã®ã¯ [[Set]]
㨠[[DefineOwnProperty]]
ã® 2 ã¤ã ãã§ããé常ã®ãªãã¸ã§ã¯ãã®å ´åãåè
ã¯ã»ãã¿ã¼ãå¼ã³åºãã¾ãããå¾è
ã¯å¼ã³ã¾ãããï¼ã¾ãã[[Set]]
ã¯æ¢åã®ããããã£ããªãå ´åãããããã£ããã¼ã¿ããããã£ã®å ´åã¯å
é¨ã§ [[DefineOwnProperty]]
ãå¼ã³åºãã¾ããï¼obj.x = 1
ã®æ§æã [[Set]]
ã使ç¨ããObject.defineProperty()
ã [[DefineOwnProperty]]
ã使ç¨ãããã¨ã¯ç¥ã£ã¦ããããããã¾ããããä»ã«ãçµã¿è¾¼ã¿ã¡ã½ãããæ§æãã©ã®ãããªæå³ã§ä½¿ç¨ãããã¯ããã«ããããã¨ã§ã¯ããã¾ãããä¾ãã°ãã¯ã©ã¹ãã£ã¼ã«ã㯠[[DefineOwnProperty]]
ã®æå³ã使ç¨ãã¦ããããã®ããæ´¾çã¯ã©ã¹ã§ãã£ã¼ã«ãã宣è¨ãã¦ããã¹ã¼ãã¼ã¯ã©ã¹ã§å®ç¾©ããã¦ããã»ãã¿ã¼ã¯å¼ã³åºããã¾ããã
Proxy()
æ°ãã Proxy
ãªãã¸ã§ã¯ããçæãã¾ãã
ã¡ã¢: Proxy.prototype
ããããã£ã¯ãªãã®ã§ãProxy
ã¤ã³ã¹ã¿ã³ã¹ã«ã¯ç¹å¥ãªããããã£ãã¡ã½ããã¯ããã¾ããã
Proxy.revocable()
åãæ¶ãå¯è½ãª Proxy
ãªãã¸ã§ã¯ããçæãã¾ãã
ãã®ä¾ã§ã¯ãä¸ããããããããã£åããªãã¸ã§ã¯ãã«åå¨ããªãå ´åãæ¢å®å¤ã§ãã 37
ãè¿ãã¾ããããã§ã¯ get()
ãã³ãã©ã¼ã使ç¨ãã¦ãã¾ãã
const handler = {
get(obj, prop) {
return prop in obj ? obj[prop] : 37;
},
};
const p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;
console.log(p.a, p.b); // 1, undefined
console.log("c" in p, p.c); // false, 37
ä½ãããªã転éãããã·ã¼
ãã®ä¾ã§ã¯ããããã·ã¼ããããã«å¯¾ãã¦é©ç¨ããããã¹ã¦ã®æä½ã転éããå ã«ããã¤ãã£ãã® JavaScript ãªãã¸ã§ã¯ãã使ã£ã¦ãã¾ãã
const target = {};
const p = new Proxy(target, {});
p.a = 37; // æä½ã¯ãããã·ã¼ã¸è»¢éããã¾ã
console.log(target.a); // 37 ï¼æä½ã¯æ£ãã転éããã¾ããï¼
ãã®ãä½ãããªããããã·ã¼ãã¯ãã¬ã¼ã³ãª JavaScript ãªãã¸ã§ã¯ãã«å¯¾ãã¦ã¯ãã¾ãããã¾ãããDOM è¦ç´ ãMap
ãªãã¸ã§ã¯ããªã©ã®ãã¤ãã£ããªãã¸ã§ã¯ãããããã¯å
é¨ã¹ããããæã¤ä½ãã®ãªãã¸ã§ã¯ãã«å¯¾ãã¦ã¯æ©è½ããªããã¨ã«æ³¨æãã¦ãã ããã詳細ã¯ãã©ã¤ãã¼ããã£ã¼ã«ãã¯è»¢éã§ããªããåç
§ãã¦ãã ããã
ãããã·ã¼ã¯ããã¯ãç°ãªãã¢ã¤ãã³ãã£ãã£ãæã¤å¥ã®ãªãã¸ã§ã¯ãã§ãããã©ããããããªãã¸ã§ã¯ãã¨å¤é¨ã¨ã®éãéå¶ãã ãããã·ã¼ ã§ãããã®ããããããã·ã¼ã¯å ãªãã¸ã§ã¯ãã®ãã©ã¤ãã¼ãè¦ç´ ã«ç´æ¥ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ããã
class Secret {
#secret;
constructor(secret) {
this.#secret = secret;
}
get secret() {
return this.#secret.replace(/\d+/, "[REDACTED]");
}
}
const aSecret = new Secret("123456");
console.log(aSecret.secret); // [REDACTED]
// ä½ãããªã転éã®ããã«è¦ãã
const proxy = new Proxy(aSecret, {});
console.log(proxy.secret); // TypeError: Cannot read private member #secret from an object whose class did not declare it
ããã¯ããããã·ã¼ã® get
ãã©ãããå¼ã³åºãã¨ãthis
ã®å¤ãå
ã® secret
ã§ã¯ãªã proxy
ã«ãªãããã#secret
ã«ã¯ã¢ã¯ã»ã¹ã§ããªãããã§ãããããä¿®æ£ããã«ã¯ãå
ã® secret
ã this
ã¨ãã¦ä½¿ç¨ãã¦ãã ããã
const proxy = new Proxy(aSecret, {
get(target, prop, receiver) {
// æ¢å®ã§ã¯ãReflect.get(target, prop, receiver) ã®ããã«ãªãã
// `this` ã®å¤ãç°ãªãããã«ãªãã¾ãã
return target[prop];
},
});
console.log(proxy.secret);
ã¡ã½ããã®å ´åãããã¯ã¡ã½ããã® this
å¤ãå
ãªãã¸ã§ã¯ãã«ãªãã¤ã¬ã¯ãããªããã°ãªããªããã¨ãæå³ãã¦ãã¾ãã
class Secret {
#x = 1;
x() {
return this.#x;
}
}
const aSecret = new Secret();
const proxy = new Proxy(aSecret, {
get(target, prop, receiver) {
const value = target[prop];
if (value instanceof Function) {
return function (...args) {
return value.apply(this === receiver ? target : this, args);
};
}
return value;
},
});
console.log(proxy.x());
JavaScript ã®ãã¤ãã£ããªãã¸ã§ã¯ãã®ä¸ã«ã¯ãå
é¨ã¹ããã ã¨ãããJavaScript ã³ã¼ãããã¯ã¢ã¯ã»ã¹ã§ããªãããããã£ãæã¤ãã®ãããã¾ããä¾ãã°ãMap
ãªãã¸ã§ã¯ã㯠[[MapData]]
ã¨ããå
é¨ã¹ããããæã£ã¦ãããããã¯ãããã®ãã¼ã¨å¤ã®ãã¢ãæ ¼ç´ãã¦ãã¾ãããã®ããããããã®è»¢éãããã·ã¼ãäºç´°ãªãã¨ã§ä½æãããã¨ã¯ã§ãã¾ããã
const proxy = new Proxy(new Map(), {});
console.log(proxy.size); // TypeError: get size method called on incompatible Proxy
ãã®ãã¨ãåé¿ããããã«ã¯ãä¸ã§ç¤ºãã "this
-recovering" ãããã·ã¼ã使ç¨ããå¿
è¦ãããã¾ãã
Proxy
ã使ãã¨ããªãã¸ã§ã¯ãã«æ¸¡ãããå¤ãç°¡åã«æ¤è¨¼ã§ãã¾ãããã®ä¾ã§ã¯ set()
ãã³ãã©ã¼ã使ç¨ãã¦ãã¾ãã
const validator = {
set(obj, prop, value) {
if (prop === "age") {
if (!Number.isInteger(value)) {
throw new TypeError("å¹´é½¢ãæ´æ°ã§ã¯ããã¾ãã");
}
if (value > 200) {
throw new RangeError("å¹´é½¢ã䏿£ãªããã§ã");
}
}
// å¤ãä¿åããæ¢å®ã®æå
obj[prop] = value;
// å¤ã®ä¿åãæåãããã¨ãè¿ãã¾ãã
return true;
},
};
const person = new Proxy({}, validator);
person.age = 100;
console.log(person.age); // 100
person.age = "young"; // ä¾å¤ãçºçãã
person.age = 300; // ä¾å¤ãçºçãã
DOM ãã¼ãã®æä½
ãã®ä¾ã§ã¯ã2 ã¤ã®ç°ãªãè¦ç´ ã®å±æ§ãåãæ¿ããããã« Proxy
ã使ç¨ãã¦ãã¾ããã¤ã¾ãã䏿¹ã®è¦ç´ ã§å±æ§ãè¨å®ããã¨ãä»ã® 2 種é¡ã®è¦ç´ ã§ã¯å±æ§ãè§£é¤ããã¾ãã
selected
ããããã£ãæã¤ãªãã¸ã§ã¯ãã®ãããã·ã¼ã§ãã view
ãªãã¸ã§ã¯ãã使ãã¾ãããããã·ã¼ãã³ãã©ã¼ã¯ set()
ãã³ãã©ã¼ãå®ç¾©ãã¾ãã
HTML è¦ç´ ã view.selected
ã«å²ãå½ã¦ãã¨ãããã®è¦ç´ ã® 'aria-selected'
屿§ã¯ true
ã«è¨å®ããã¾ãããã®å¾ãç°ãªãè¦ç´ ã view.selected
ã«å²ãå½ã¦ãå ´åããã®è¦ç´ ã® 'aria-selected'
屿§ã¯ true
ã«è¨å®ãããååã®è¦ç´ ã® 'aria-selected'
屿§ã¯èªåçã« false
ã«è¨å®ããã¾ãã
const view = new Proxy(
{
selected: null,
},
{
set(obj, prop, newVal) {
const oldVal = obj[prop];
if (prop === "selected") {
if (oldVal) {
oldVal.setAttribute("aria-selected", "false");
}
if (newVal) {
newVal.setAttribute("aria-selected", "true");
}
}
// å¤ãä¿åããæ¢å®ã®æå
obj[prop] = newVal;
// æåã示ã
return true;
},
},
);
const item1 = document.getElementById("item-1");
const item2 = document.getElementById("item-2");
// select item1:
view.selected = item1;
console.log(`item1: ${item1.getAttribute("aria-selected")}`);
// item1: true
// selecting item2 de-selects item1:
view.selected = item2;
console.log(`item1: ${item1.getAttribute("aria-selected")}`);
// item1: false
console.log(`item2: ${item2.getAttribute("aria-selected")}`);
// item2: true
å¤è£æ£ã¨è¿½å ããããã£
ãã® products
ãããã·ã¼ãªãã¸ã§ã¯ãã¯ã渡ãããå¤ãè©ä¾¡ããå¿
è¦ã§ããã°é
åã«å¤æãã¾ããã¾ãã latestBrowser
ã¨ãã追å ããããã£ãã²ãã¿ã¼ã¨ã»ãã¿ã¼ã®ä¸¡æ¹ã§ãµãã¼ããã¦ãã¾ãã
const products = new Proxy(
{
browsers: ["Firefox", "Chrome"],
},
{
get(obj, prop) {
// 追å ããããã£
if (prop === "latestBrowser") {
return obj.browsers[obj.browsers.length - 1];
}
// å¤ãè¿ãæ¢å®ã®æå
return obj[prop];
},
set(obj, prop, value) {
// 追å ããããã£
if (prop === "latestBrowser") {
obj.browsers.push(value);
return true;
}
// å¤ãé
åã§ãªããã°å¤æ
if (typeof value === "string") {
value = [value];
}
// å¤ãä¿åããæ¢å®ã®æå
obj[prop] = value;
// å¤ã®ä¿åãæåãããã¨ãè¿ãã¾ãã
return true;
},
},
);
console.log(products.browsers);
// ['Firefox', 'Chrome']
products.browsers = "Safari";
// (ééãã¦) æååãæ¸¡ã
console.log(products.browsers);
// ['Safari'] <- åé¡ããã¾ãããå¤ã¯é
åã«ãªã£ã¦ãã¾ã
products.latestBrowser = "Edge";
console.log(products.browsers);
// ['Safari', 'Edge']
console.log(products.latestBrowser);
// 'Edge'
å®å
¨ãªãã©ãããªã¹ãã®ä¾
ããã§ãæè²çãªç®çã®ããã«ãå®å
¨ãªãµã³ãã« traps
ãªã¹ãã使ããããã«ããã®ç¨®ã®å¦çã«ç¹ã«é©ãã¦ãã ãã¤ãã£ã ãªãã¸ã§ã¯ããããªãã¡åç´ãª Cookie ã®ãã¬ã¼ã ã¯ã¼ã¯ã使ãã docCookies
ã°ãã¼ãã«ãªãã¸ã§ã¯ãããããã·ã¼åãã¦ã¿ããã¨ã«ãã¾ãããã
/*
const docCookies = ... "docCookies" ãªãã¸ã§ã¯ãã¯ä¸è¨ããåå¾ãã¦ãã¾ãã
https://reference.codeproject.com/dom/document/cookie/simple_document.cookie_framework
*/
const docCookies = new Proxy(docCookies, {
get(target, key) {
return target[key] ?? target.getItem(key) ?? undefined;
},
set(target, key, value) {
if (key in target) {
return false;
}
return target.setItem(key, value);
},
deleteProperty(target, key) {
if (!(key in target)) {
return false;
}
return target.removeItem(key);
},
ownKeys(target) {
return target.keys();
},
has(target, key) {
return key in target || target.hasItem(key);
},
defineProperty(target, key, descriptor) {
if (descriptor && "value" in descriptor) {
target.setItem(key, descriptor.value);
}
return target;
},
getOwnPropertyDescriptor(target, key) {
const value = target.getItem(key);
return value
? {
value,
writable: true,
enumerable: true,
configurable: false,
}
: undefined;
},
});
/* Cookie ã®ãã¹ã */
console.log((docCookies.myCookie1 = "First value"));
console.log(docCookies.getItem("myCookie1"));
docCookies.setItem("myCookie1", "Changed value");
console.log(docCookies.myCookie1);
仿§æ¸ ãã©ã¦ã¶ã¼ã®äºææ§ é¢é£æ
å ±
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