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
+10-10Lines changed: 10 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
2
2
# Proxy и Reflect
3
3
4
-
Объект *proxy* служит обёрткой для другого объекта, а также перехватывает и (опционально) обрабатывает разные действия, например чтение/запись свойств и другие, производимые с оригинальным объектом.
4
+
Объект *прокси* "оборачивается" вокруг другого объекта и может перехватывать (и, при желании, самостоятельно обрабатывать) разные действия с ним, например чтение/запись свойств и другие.
5
5
6
6
Прокси используются во многих библиотеках и некоторых браузерных фреймворках. В этой главе мы увидим много случаев применения прокси в решении реальных задач.
7
7
@@ -14,7 +14,7 @@ let proxy = new Proxy(target, handler)
14
14
-`target` -- это объект, который обёртывается, может быть чем угодно, включая функции.
15
15
-`handler` -- объект с "ловушками" ("traps"): методами, которые перехватывают разные операции, например `get` при чтении свойства, `set` при записи свойства и так далее.
16
16
17
-
Если в `handler` объекта `proxy` имеется соответствующая "ловушка", то она срабатывает, и прокси имеет возможность как-то среагировать, иначе же действовать будет уже оригинальный объект из`target`.
17
+
При операциях над `proxy`, если в `handler` имеется соответствующая "ловушка", то она срабатывает, и прокси имеет возможность как-то среагировать, иначе действие будет совершено над оригинальным объектом`target`.
18
18
19
19
В качестве примера давайте для начала создадим прокси без всяких ловушек:
20
20
@@ -30,7 +30,7 @@ alert(proxy.test); // 5, мы также можем прочитать его и
30
30
for(let key in proxy) alert(key); // test, итерация работает (3)
31
31
```
32
32
33
-
Так как нет ловушек, то все операции на `proxy`в итоге применяются к оригинальному объекту `target`.
33
+
Так как нет ловушек, то все операции на `proxy` применяются к оригинальному объекту `target`.
34
34
35
35
1. Запись свойства `proxy.test=` устанавливает значение на `target`.
36
36
2. Чтение свойства `proxy.test` возвращает значение из `target`.
@@ -42,13 +42,13 @@ for(let key in proxy) alert(key); // test, итерация работает (3)
42
42
43
43
Прокси -- это особенный объект, у него нет собственных свойств. С пустым `handler` он просто перенаправляет все операции на `target`.
44
44
45
-
Если мы хотим придать ему какую-то магическую силу, то следует добавить ловушки.
45
+
Чтобы активировать его возможности, добавим ловушки.
46
46
47
47
Вот список внутренних методов объектов из [спецификации Proxy](https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots). Прокси может перехватывать вызов любого из них, нужно только добавить соответствующий обработчик в `handler`.
48
48
49
49
В таблице ниже:
50
-
-**Внутренний метод** -- название операции над объектом, определённое в спецификации. Например, `[[Get]]` -- это имя внутреннего метода для чтения свойства объекта. В спецификации описывается, как это должно быть реализовано, до мельчайших низкоуровневых подробностей.
51
-
-**Ловушка** -- это имя метода, который мы можем добавить в параметр `handler` при создании прокси. Этот метод будет действовать как ловушка, перехватывая операции над объектом и позволяя совершать над ним какие-то дополнительные действия.
50
+
-**Внутренний метод** -- название операции над объектом, определённое в спецификации. Например, `[[Get]]` -- это имя внутреннего (используемого только внутри спецификации) метода для чтения свойства объекта. В спецификации описывается, как это должно быть реализовано, до мельчайших низкоуровневых подробностей.
51
+
-**Ловушка** -- это имя метода, который мы можем добавить в параметр `handler` при создании прокси. Этот метод будет действовать как ловушка, перехватывающая данную операцию и позволяющая совершать какие-то дополнительные действия.
52
52
53
53
54
54
| Внутренний метод | Ловушка | Срабатывает при... |
@@ -68,15 +68,15 @@ for(let key in proxy) alert(key); // test, итерация работает (3)
68
68
|`[[OwnPropertyKeys]]`|`ownKeys`|[Object.keys](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/keys), [Object.getOwnPropertyNames](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames), [Object.getOwnPropertySymbols](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertySymbols), итерация по ключам |
69
69
70
70
```warn header="Инварианты"
71
-
JavaScript предполагает, что при реализации внутренних методов и ловушек в коде будут выполнены определённые условия -- инварианты.
71
+
JavaScript налагает некоторые условия - инварианты на реализацию внутренних методов и ловушек.
72
72
73
73
Большинство из них касаются возвращаемых значений:
74
74
- `[[Set]]` должен возвращать `true`, если значение было успешно записано, иначе `false`.
75
75
- `[[Delete]]` должен возвращать `true`, если значение было успешно удалено, иначе `false`.
76
-
- ...и так далее, мы ещё столкнёмся с этим в примерах ниже.
76
+
- ...и так далее, мы увидим больше в примерах ниже.
77
77
78
-
Но есть и другие условия:
79
-
- `[[GetPrototypeOf]]`, применённый к прокси, должен возвращать то же значение, что и метод `[[GetPrototypeOf]]`, применённый к оригинальному объекту.
78
+
Есть и другие инварианты, например:
79
+
- метод `[[GetPrototypeOf]]`, применённый к прокси, должен возвращать то же значение, что и метод `[[GetPrototypeOf]]`, применённый к оригинальному объекту.
80
80
81
81
Другими словами, чтение прототипа объекта `proxy` всегда должно возвращать прототип оригинального объекта. Ловушка `getPrototypeOf` может перехватывать эту операцию, но в любом случае должна выполнять указанное условие, а не делать что-то сумасшедшее.
0 commit comments