You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/99-js-misc/01-proxy/article.md
+13-13Lines changed: 13 additions & 13 deletions
Original file line number
Diff line number
Diff line change
@@ -690,7 +690,7 @@ Past `get` je zde „průhledná“, vrací původní vlastnost a nic jiného ne
690
690
691
691
Vypadá to, že je všechno v pořádku. Učiňme však tento příklad trochu složitějším.
692
692
693
-
Po zdědění jiného objektu `admin` z objektu `uživatel` můžeme pozorovat nesprávné chování:
693
+
Po zdědění jiného objektu `správce` z objektu `uživatel` můžeme pozorovat nesprávné chování:
694
694
695
695
```js run
696
696
let uživatel = {
@@ -707,31 +707,31 @@ let uživatelProxy = new Proxy(uživatel, {
707
707
});
708
708
709
709
*!*
710
-
letadmin= {
710
+
letsprávce= {
711
711
__proto__: uživatelProxy,
712
-
_jméno:"Admin"
712
+
_jméno:"Správce"
713
713
};
714
714
715
-
// Očekáváme: Admin
716
-
alert(admin.jméno); // vypíše: Host (?!?)
715
+
// Očekáváme: Správce
716
+
alert(správce.jméno); // vypíše: Host (?!?)
717
717
*/!*
718
718
```
719
719
720
-
Načtení `admin.jméno` by mělo vrátit `"Admin"`, ne `"Host"`!
720
+
Načtení `správce.jméno` by mělo vrátit `"Správce"`, ne `"Host"`!
721
721
722
722
V čem je problém? Udělali jsme snad něco špatně s dědičností?
723
723
724
724
Pokud však odstraníme proxy, bude všechno fungovat tak, jak očekáváme.
725
725
726
726
Problém je ve skutečnosti v proxy na řádku `(*)`.
727
727
728
-
1. Když načítáme `admin.jméno`, objekt `admin` takovou vlastnost nemá, a proto hledání přejde k jeho prototypu.
728
+
1. Když načítáme `správce.jméno`, objekt `správce` takovou vlastnost nemá, a proto hledání přejde k jeho prototypu.
729
729
2. Prototypem je `uživatelProxy`.
730
730
3. Když načítáme vlastnost `jméno` z proxy, spustí se jeho past `get` a na řádku `(*)` ji vrátí z původního objektu jako `cíl[vlastnost]`.
731
731
732
732
Volání `cíl[vlastnost]`, když `vlastnost` je getter, spustí kód tohoto getteru v kontextu `this=cíl`. Výsledkem je tedy `this._jméno` z původního objektu `cíl`, což je: z objektu `uživatel`.
733
733
734
-
Abychom takové situace opravili, potřebujeme `příjemce`, třetí argument pasti `get`. Ten udržuje správné `this`, které bude předáno getteru. V našem případě to je `admin`.
734
+
Abychom takové situace opravili, potřebujeme `příjemce`, třetí argument pasti `get`. Ten udržuje správné `this`, které bude předáno getteru. V našem případě to je `správce`.
735
735
736
736
Jak předat kontext getteru? Pro běžnou funkci bychom mohli použít `call/apply`, ale tohle je getter, ten se „nevolá“, jenom se k němu přistupuje.
0 commit comments