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
+11-11Lines changed: 11 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,7 +15,7 @@ let proxy = new Proxy(target, handler)
15
15
-`target` -- 감싸게 될 객체로, 함수를 포함한 모든 객체가 가능합니다.
16
16
-`handler` -- 동작을 가로채는 메서드인 '트랩(trap)'이 담긴 객체로, 여기서 프락시를 설정합니다(예시: `get` 트랩은 `target`의 프로퍼티를 읽을 때, `set` 트랩은 `target`의 프로퍼티를 쓸 때 활성화됨).
17
17
18
-
`proxy`에 작업이 가해지고, `handler`에 상응하는 트랩이 있으면 트랩이 실행되어 프락시가 이 작업을 처리할 기회를 얻게 됩니다. 트랩이 없으면 작업은 `target`에 직접 수행됩니다.
18
+
`proxy`에 작업이 가해지고, `handler`에 작업과 상응하는 트랩이 있으면 트랩이 실행되어 프락시가 이 작업을 처리할 기회를 얻게 됩니다. 트랩이 없으면 `target`에 작업이 직접 수행됩니다.
19
19
20
20
먼저, 트랩이 없는 프락시를 사용한 예시를 살펴봅시다.
21
21
@@ -47,7 +47,7 @@ for(let key in proxy) alert(key); // test, 반복도 잘 동작합니다. -- (3)
47
47
48
48
그 전에 먼저, 트랩을 사용해 가로챌 수 있는 작업은 무엇이 있는지 알아봅시다.
49
49
50
-
객체에 어떤 작업을 할 땐, 자바스크립트 명세서에 정의된 '내부 메서드(internal method)'가 깊숙한 곳에서 관여합니다. 프로퍼티를 읽을 땐 `[[Get]]`이라는 내부 메서드가, 프로퍼티에 쓸 땐 `[[Set]]`이라는 내부 메서드가 관여하게 되죠. 이런 내부 메서드들은 명세서에만 정의된 메서드이기 때문에 개발자가 코드를 사용해 호출할 순 없습니다.
50
+
객체에 어떤 작업을 할 땐 자바스크립트 명세서에 정의된 '내부 메서드(internal method)'가 깊숙한 곳에서 관여합니다. 프로퍼티를 읽을 땐 `[[Get]]`이라는 내부 메서드가, 프로퍼티에 쓸 땐 `[[Set]]`이라는 내부 메서드가 관여하게 되죠. 이런 내부 메서드들은 명세서에만 정의된 메서드이기 때문에 개발자가 코드를 사용해 호출할 순 없습니다.
51
51
52
52
프락시의 트랩은 내부 메서드의 호출을 가로챕니다. 프락시가 가로채는 내부 메서드 리스트는 [명세서](https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots)에서 확인할 수 있는데, 아래 표에도 이를 정리해 놓았습니다.
53
53
@@ -72,22 +72,22 @@ for(let key in proxy) alert(key); // test, 반복도 잘 동작합니다. -- (3)
72
72
```warn header="규칙"
73
73
내부 메서드나 트랩을 쓸 땐 자바스크립트에서 정한 몇 가지 규칙(invariant)을 반드시 따라야 합니다.
74
74
75
-
대부분의 조건은 반환 값과 관련되어있습니다.
75
+
대부분의 규칙은 반환 값과 관련되어있습니다.
76
76
- 값을 쓰는 게 성공적으로 처리되었으면 `[[Set]]`은 반드시 `true`를 반환해야 합니다. 그렇지 않은 경우는 `false`를 반환해야 합니다.
77
77
- 값을 지우는 게 성공적으로 처리되었으면 `[[Delete]]`는 반드시 `true`를 반환해야 합니다. 그렇지 않은 경우는 `false`를 반환해야 합니다.
78
78
- 기타 등등(아래 예시를 통해 더 살펴보겠습니다.)
79
79
80
80
이 외에 다른 조건도 있습니다.
81
81
- 프락시 객체를 대상으로 `[[GetPrototypeOf]]`가 적용되면 프락시 객체의 타깃 객체에 `[[GetPrototypeOf]]`를 적용한 것과 동일한 값이 반환되어야 합니다. 프락시의 프로토타입을 읽는 것은 타깃 객체의 프로토타입을 읽는 것과 동일해야 하죠.
82
82
83
-
트랩이 연산을 가로챌 땐 위에서 언급한 규칙을 따라야 하죠.
83
+
트랩이 연산을 가로챌 땐 위에서 언급한 규칙을 따라야 합니다.
84
84
85
-
규칙은 자바스크립트가 일관된 동작을 하고 잘못된 동작이 있으면 이를 고쳐주는 역할을 합니다. 규칙 목록은 [명세서](https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots)에서 확인할 수 있습니다. 이상한 짓을 하지 않는 이상 이 규칙을 어길 일은 거의 없습니다.
85
+
이와 같은 규칙은 자바스크립트가 일관된 동작을 하고 잘못된 동작이 있으면 이를 고쳐주는 역할을 합니다. 규칙 목록은 [명세서](https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots)에서 확인할 수 있습니다. 아주 이상한 짓을 하지 않는한 이 규칙을 어길 일은 거의 없을겁니다.
86
86
```
87
87
88
88
자, 이제 본격적으로 실용적인 예시들을 살펴보면서 프락시 객체가 어떻게 동작하는지 알아봅시다.
89
89
90
-
## 'get' 트랩으로 프로퍼티 기본값 설정하기
90
+
## get 트랩으로 프로퍼티 기본값 설정하기
91
91
92
92
가장 흔히 볼 수 있는 트랩은 프로퍼티를 읽거나 쓸 때 사용되는 트랩입니다.
93
93
@@ -181,7 +181,7 @@ dictionary = new Proxy(dictionary, ...);
181
181
타깃 객체의 위치와 상관없이 프락시 객체는 타깃 객체를 덮어써야만 합니다. 객체를 프락시로 감싼 이후엔 절대로 타깃 객체를 참조하는 코드가 없어야 합니다. 그렇지 않으면 엉망이 될 확률이 아주 높아집니다.
182
182
````
183
183
184
-
## 'set' 트랩으로 프로퍼티 값 검증하기
184
+
## set 트랩으로 프로퍼티 값 검증하기
185
185
186
186
숫자만 저장할 수 있는 배열을 만들고 싶다고 가정해봅시다. 숫자형이 아닌 값을 추가하려고 하면 에러가 발생하도록 해야겠죠.
187
187
@@ -239,7 +239,7 @@ alert("윗줄에서 에러가 발생했기 때문에 이 줄은 절대 실행되
239
239
`true`를 반환하지 않았거나 falsy한 값을 반환하게 되면 `TypeError`가 발생합니다.
240
240
```
241
241
242
-
## 'ownKeys'와 'getOwnPropertyDescriptor'로 반복 작업하기
242
+
## ownKeys와 getOwnPropertyDescriptor로 반복 작업하기
243
243
244
244
`Object.keys`, `for..in` 반복문을 비롯한 프로퍼티 순환 관련 메서드 대다수는 내부 메서드 `[[OwnPropertyKeys]]`(트랩 메서드는 `ownKeys`임)를 사용해 프로퍼티 목록을 얻습니다.
245
245
@@ -323,7 +323,7 @@ alert( Object.keys(user) ); // a, b, c
323
323
324
324
객체에 프로퍼티가 없을 때 `[[GetOwnProperty]]`만 가로채면 된다는 점을 다시 한번 상기하시기 바랍니다.
325
325
326
-
## 'deleteProperty'와 여러 트랩을 사용해 프로퍼티 보호하기
326
+
## deleteProperty와 여러 트랩을 사용해 프로퍼티 보호하기
327
327
328
328
`_`(밑줄)이 앞에 붙은 프로퍼티나 메서드는 내부용으로만 쓰도록 하는 컨벤션은 널리 사용되고 있는 컨벤션 중 하나입니다. `_`이 앞에 붙으면 객체 바깥에선 이 프로퍼티에 접근해선 안 됩니다.
0 commit comments