ë©ííë¡ê·¸ëë°
Proxyì Reflect ê°ì²´ë¥¼ ì¬ì©íë©´ 기본 ì¸ì´ ëì(ì: ìì± ì¡°í, í ë¹, ì´ê±°, í¨ì í¸ì¶ ë±)ì ê°ë¡ì±ê³ ì¬ì©ì ì ì ëìì ì ìí ì ììµëë¤. ì´ ë ê°ì²´ë¥¼ íì©íë©´ 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(ì¬ê¸°ìë ë¹ ê°ì²´)ê³¼ get í¨ì ì´ êµ¬íë handler ê°ì²´ë¥¼ ì ìí©ëë¤. ì¬ê¸°ìë íë¡ìë ê°ì²´ê° ì ìëì§ ìì ìì±ì ê°ì ¸ì¬ ë undefined를 ë°ííì§ ìê³ ëì ì«ì 42를 ë°íí©ëë¤.
ì¶ê° ìì ë Proxy ì°¸ê³ íì´ì§ìì íì¸í ì ììµëë¤.
ì©ì´
íë¡ì 기ë¥ì ì¤ëª í ë ë¤ì ì©ì´ê° ì¬ì©ë©ëë¤.
- handler
-
í¸ë©ì í¬í¨íë ì리 íìì ê°ì²´ì ëë¤.
- traps
-
ìì± ì 근과 ê°ì ëìì ì ê³µíë ë©ìëì ëë¤. (ì´ìì²´ì ì 'í¸ë©' ê°ë ê³¼ ì ì¬í©ëë¤.)
- target
-
íë¡ìê° ê°ìííë ê°ì²´ì ëë¤. íë¡ìì ì ì¥ì ë°±ìëë¡ ì주 ì¬ì©ë©ëë¤. ê°ì²´ì íì¥ ë¶ê° ì¬ë¶ë ì¤ì ë¶ê° ìì± ê´ë ¨ ë¶ë³ì±(ë³ê²½ëì§ ìë ì미)ì targetì 기ì¤ì¼ë¡ ê²ì¦ë©ëë¤.
- invariants
-
ì¬ì©ì ì ì ëìì 구íí ë ì§ì¼ì¼ íë 'ë¶ë³ì±'ì ì미í©ëë¤. í¸ë¤ë¬ì ë¶ë³ì±ì ìë°íë©´
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: ì·¨ìë íë¡ììì 'get'ì ìíí ì ììµëë¤
proxy.foo = 1; // TypeError: ì·¨ìë íë¡ììì 'set'ì ìíí ì ììµëë¤
delete proxy.foo; // TypeError: ì·¨ìë íë¡ììì 'deleteProperty'를 ìíí ì ììµëë¤
console.log(typeof proxy); // "object", typeofë í¸ë©ì ì¤ííì§ ììµëë¤
리íë ì (Reflection)
Reflectë ìë°ì¤í¬ë¦½í¸ìì ê°ë¡ì±ê¸° ê°ë¥í ì°ì°ì ìíí ì ìë ë©ìë를 ì ê³µíë ë´ì¥ ê°ì²´ì
ëë¤. ì´ ë©ìëë¤ì íë¡ì í¸ë¤ë¬ì ë©ìëì ëì¼í©ëë¤.
Reflectë í¨ì ê°ì²´ê° ìëëë¤.
Reflectë 기본 ëìì í¸ë¤ë¬ìì targetì¼ë¡ ì ë¬í ë ì ì©íê² ì¬ì©ë©ëë¤.
ì를 ë¤ì´, 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 {
// ì¤í¨
}