Skip to content

Commit 13852a3

Browse files
[함수의 prototype 프로퍼티] 개선
- 좀 더 쉽게 설명
1 parent 0955f6e commit 13852a3

File tree

1 file changed

+31
-31
lines changed
  • 1-js/08-prototypes/02-function-prototype

1 file changed

+31
-31
lines changed

1-js/08-prototypes/02-function-prototype/article.md

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
# 함수의 prototype 프로퍼티
22

3-
`new F()`와 같은 생성자 함수를 이용하면 새로운 객체를 만들 수 있다는 걸 앞서 배운 바 있습니다.
3+
우리는 리터럴 뿐만 아니라 `new F()`와 같은 생성자 '함수'로도 새로운 객체를 만들 수 있다는 배운 바 있습니다.
44

5-
그런데 `F.prototype`이 객체면 `new` 연산자는 `F.prototype`사용해 새롭게 생성된 객체의 [[Prototype]]설정합니다.
5+
이번 글에선 생성자 함수를 사용해 객체를 만든 경우의 프로토타입 동작 방식에 대해 알아보도록 하겠습니다. 생성자 함수로 객체를 만들었을 때 리터럴 방식과 차이점은 생성자 함수의 프로토타입이 객체인 경우에 `new` 연산자를 사용해 만든 객체는 생성자 함수의 프로토타입 정보를 사용해 [[Prototype]]설정한다는 것입니다.
66

77
```smart
8-
자바스크립트가 만들어졌을 때는 프로토타입 기반 상속이 주요 기능 중 하나였습니다.
8+
자바스크립트가 만들어졌을 당시엔 프로토타입 기반 상속이 자바스크립트의 주요 기능 중 하나였습니다.
99
1010
그런데 과거엔 프로토타입에 직접 접근할 방법이 없었습니다. 그나마 믿고 사용할 수 있었던 방법은 이번 챕터에서 설명할 생성자 함수의 `"prototype"` 프로퍼티를 이용하는 방법뿐이었죠. 많은 스크립트가 아직 이 방법을 사용하는 이유가 여기에 있습니다.
1111
```
1212

13-
`F.prototype`에서 `"prototype"``F`에 정의된 일반 프로퍼티라는 점에 주의해 주시기 바랍니다. 앞서 배웠던 '프로토타입' 객체와 같아 보이지만 `F.prototype`에서 `"prototype"`은 이름만 같은 일반 프로퍼티입니다.
13+
생성자 함수의 프로토타입을 의미하는 `F.prototype`에서 `"prototype"``F`에 정의된 일반 프로퍼티라는 점에 주의해 글을 읽어 주시기 바랍니다. `F.prototype`에서 `"prototype"`바로 앞에서 배운 '프로토타입'과 비슷하게 들리겠지만 이름만 같을 뿐 실제론 다른 일반 프로퍼티입니다.
1414

1515
예시:
1616

@@ -27,7 +27,7 @@ function Rabbit(name) {
2727
Rabbit.prototype = animal;
2828
*/!*
2929

30-
let rabbit = new Rabbit("White Rabbit"); // rabbit.__proto__ == animal
30+
let rabbit = new Rabbit("흰 토끼"); // rabbit.__proto__ == animal
3131

3232
alert( rabbit.eats ); // true
3333
```
@@ -38,19 +38,19 @@ alert( rabbit.eats ); // true
3838

3939
![](proto-constructor-animal-rabbit.svg)
4040

41-
그림에서 가로 화살표는 일반 프로퍼티인 `"prototype"`을, 세로 화살표는 `[[Prototype]]`을 나타냅니다. 세로 화살표는 `rabbit``animal`을 상속받았다는 것을 의미합니다.
41+
여기서 가로 화살표는 일반 프로퍼티인 `"prototype"`을, 세로 화살표는 `[[Prototype]]`을 나타냅니다. 세로 화살표는 `rabbit``animal`을 상속받았다는 것을 의미합니다.
4242

4343
```smart header="`F.prototype``new F`를 호출할 때만 사용됩니다."
4444
`F.prototype` 프로퍼티는 `new F`가 호출될 때만 사용됩니다. `new F`를 호출해 새롭게 만든 객체의 `[[Prototype]]`을 할당해 주죠.
4545

46-
새로운 객체가 만들어진 후에 `F.prototype` 프로퍼티가 바뀌면(`F.prototype = <another object>`) `new F`로 만들어지는 새로운 객체는 또 다른 객체를 `[[Prototype]]`으로 갖게 됩니다. 다만, 기존에 있던 객체의 `[[Prototype]]`은 그대로 유지됩니다.
46+
새로운 객체가 만들어진 후에 `F.prototype` 프로퍼티가 바뀌면(`F.prototype = <another object>`) `new F`로 만들어지는 또 다른 새로운 객체는 <another object>를 `[[Prototype]]`으로 갖게 됩니다. 다만, 기존에 있던 객체의 `[[Prototype]]`은 그대로 유지됩니다.
4747
```
4848
49-
## 함수의 prototype 프로퍼티와 constructor 프로퍼티
49+
## 함수의 디폴트 프로퍼티 prototype과 constructor 프로퍼티
5050
5151
개발자가 특별히 할당하지 않더라도 모든 함수는 `"prototype"` 프로퍼티를 갖습니다.
5252
53-
기본 프로퍼티인 `"prototype"`은 `constructor` 프로퍼티 하나만 있는 객체를 가리키는데, `constructor` 프로퍼티는 함수 자신을 가리킵니다.
53+
기본 프로퍼티 `"prototype"`은 `constructor` 프로퍼티 하나만 있는 객체를 가리키는데, 여기서 `constructor` 프로퍼티는 함수 자신을 가리킵니다.
5454
5555
이 관계를 코드와 그림으로 나타내면 다음과 같습니다.
5656
@@ -64,7 +64,7 @@ Rabbit.prototype = { constructor: Rabbit };
6464

6565
![](function-prototype-constructor.svg)
6666

67-
아래 코드를 실행해 직접 확인해봅시다.
67+
예시를 실행해 직접 확인해봅시다.
6868

6969
```js run
7070
function Rabbit() {}
@@ -74,21 +74,21 @@ function Rabbit() {}
7474
alert( Rabbit.prototype.constructor == Rabbit ); // true
7575
```
7676

77-
특별한 조작을 가하지 않았다면 `Rabbit`구현한 객체 모두에서 `[[Prototype]]`거쳐 `constructor` 프로퍼티를 사용할 수 있습니다.
77+
특별한 조작을 가하지 않았다면 `new Rabbit`실행해 만든 객체 모두에서 `[[Prototype]]`거치면 `constructor` 프로퍼티를 사용할 수 있습니다.
7878

7979
```js run
8080
function Rabbit() {}
81-
// 기본 prototype:
81+
// 디폴트 prototype:
8282
// Rabbit.prototype = { constructor: Rabbit }
8383

8484
let rabbit = new Rabbit(); // {constructor: Rabbit}을 상속받음
8585

86-
alert(rabbit.constructor == Rabbit); // true (프로토타입을 거쳐 접근함)
86+
alert(rabbit.constructor == Rabbit); // true ([[Prototype]]을 거쳐 접근함)
8787
```
8888

8989
![](rabbit-prototype-constructor.svg)
9090

91-
`constructor` 프로퍼티를 사용하면 기존에 있던 객체의 `constructor`를 사용해 새로운 객체를 만들 수 있습니다.
91+
`constructor` 프로퍼티는 기존에 있던 객체의 `constructor`를 사용해 새로운 객체를 만들때 사용할 수 있습니다.
9292

9393
아래와 같이 말이죠.
9494

@@ -98,22 +98,22 @@ function Rabbit(name) {
9898
alert(name);
9999
}
100100

101-
let rabbit = new Rabbit("White Rabbit");
101+
let rabbit = new Rabbit("흰 토끼");
102102

103103
*!*
104-
let rabbit2 = new rabbit.constructor("Black Rabbit");
104+
let rabbit2 = new rabbit.constructor("검정 토끼");
105105
*/!*
106106
```
107107

108-
객체가 있는데 이 객체를 만들 때 어떤 생성자가 사용되었는지 알 수 없는 경우(예: 객체가 서드 파티 라이브러리에서 온 경우), 이 방법을 유용하게 쓸 수 있습니다.
108+
이 방법은 객체가 있는데 이 객체를 만들 때 어떤 생성자가 사용되었는지 알 수 없는 경우(객체가 서드 파티 라이브러리에서 온 경우 등) 유용하게 쓸 수 있습니다.
109109

110-
어느 방식을 사용해 객체를 만들든 `"constructor"`에서 가장 중요한 점은 다음과 같습니다.
110+
`"constructor"`를 이야기 할 때 가장 중요한 점은
111111

112-
**자바스크립트는 알맞은 `"constructor"` 값을 보장하지 않습니다.**
112+
**자바스크립트는 알맞은 `"constructor"` 값을 보장하지 않는다**는 점입니다.
113113

114-
함수에 기본으로 `"prototype"` 값이 설정되긴 하지만 그게 전부입니다. `"constructor"` 벌어지는 모든 일은 전적으로 개발자에게 달려있습니다.
114+
함수엔 기본으로 `"prototype"`이 설정된다라는 사실 그게 전부입니다. `"constructor"`와 관련해서 벌어지는 모든 일은 전적으로 개발자에게 달려있습니다.
115115

116-
함수의 기본 `"prototype"` 값을 다른 객체로 바꾸면 이 객체엔 `"constructor"`없을 겁니다.
116+
함수에 기본으로 설정되는 `"prototype"` 프로퍼티 값을 다른 객체로 바꿔 무슨일이 일어나는지 살펴봅시다. new를 사용해 객체를 만들었지만 이 객체에 `"constructor"`없는 것을 확인할 수 있습니다.
117117

118118
예시:
119119

@@ -129,18 +129,18 @@ alert(rabbit.constructor === Rabbit); // false
129129
*/!*
130130
```
131131

132-
이런 상황을 방지하고 알맞은 `constructor`유지하려면 `"prototype"` 전체를 덮어쓰지 말고 기본 `"prototype"`에 원하는 프로퍼티를 추가/제거해야 합니다.
132+
이런 상황을 방지하고 알맞은 `constructor`제대로 활용하려면 `"prototype"` 전체를 덮어쓰지 말고 기본 `"prototype"`에 원하는 프로퍼티를 추가, 제거해야 합니다.
133133

134134
```js
135135
function Rabbit() {}
136136

137137
// Rabbit.prototype 전체를 덮어쓰지 말고
138-
// 원하는 프로퍼티는 그냥 추가하세요.
138+
// 원하는 프로퍼티가 있으면 그냥 추가합니다.
139139
Rabbit.prototype.jumps = true
140-
// 이렇게 하면 기본 Rabbit.prototype.constructor가 유지됩니다.
140+
// 이렇게 하면 디폴트 프로퍼티 Rabbit.prototype.constructor가 유지됩니다.
141141
```
142142

143-
`constructor` 프로퍼티를 수동으로 다시 만들어주는 것도 대안이 될 수 있습니다.
143+
실수로 `"prototype"`을 덮어썼다 하더라도 `constructor` 프로퍼티를 수동으로 다시 만들어주면 `constructor`를 다시 사용할 수 있습니다.
144144

145145
```js
146146
Rabbit.prototype = {
@@ -150,26 +150,26 @@ Rabbit.prototype = {
150150
*/!*
151151
};
152152

153-
// 수동으로 추가해 주었기 때문에 알맞은 constructor가 유지됩니다.
153+
// 수동으로 constructor를 추가해 주었기 때문에 우리가 알고 있던 constructor특징을 그대로 사용할 수 있습니다.
154154
```
155155

156156

157157
## 요약
158158

159-
이번 챕터에선 생성자 함수를 이용해 만든 객체에 `[[Prototype]]`을 설정해 주는 방법에 대해 간략히 알아보았습니다. 이 방법을 기반으로 하는 고급 프로그래밍 패턴에 대해선 추후 학습할 예정입니다.
159+
이번 챕터에선 생성자 함수를 이용해 만든 객체 `[[Prototype]]`이 어떻게 설정되는지 간략히 알아보았습니다. 이 방법을 기반으로 하는 고급 프로그래밍 패턴에 대해선 추후 학습할 예정입니다.
160160

161161
몇 가지 사항만 명확하게 이해하고 있으면 지금까지 배운 것들은 복잡하지 않습니다.
162162

163-
- `F.prototype` 프로퍼티는 `[[Prototype]]`과는 다릅니다. `F.prototype`은 `new F()`를 호출할 때 만들어지는 새로운 객체의 `[[Prototype]]`을 설정합니다.
163+
- 생성자 함수에 기본으로 세팅되는 프로퍼티(`F.prototype`)는 `[[Prototype]]` 다릅니다. `F.prototype`은 `new F()`를 호출할 때 만들어지는 새로운 객체의 `[[Prototype]]`을 설정합니다.
164164
- `F.prototype`의 값은 객체나 null만 가능합니다. 다른 값은 무시됩니다.
165-
- 지금까지 배운 내용은 생성자 함수에 `"prototype"`를 설정하고, 이 생성자 함수를 `new`를 사용해 호출할 때만 적용됩니다.
165+
- 지금까지 배운 내용은 생성자 함수를 `new`를 사용해 호출할 때만 적용됩니다.
166166

167-
일반 객체에 `"prototype"` 프로퍼티를 사용하면 아무런 일이 일어나지 않습니다.
167+
일반 객체엔 `"prototype"` 프로퍼티를 추가해도 아무런 일이 일어나지 않습니다.
168168
```js
169169
let user = {
170170
name: "John",
171171
prototype: "Bla-bla" // 마술은 일어나지 않습니다.
172172
};
173173
```
174174
175-
모든 함수는 기본적으로 `F.prototype = { constructor : F }`를 가지고 있으므로 함수의 `"constructor"` 프로퍼티를 사용하면 객체의 생성자를 얻을 수 있습니다.
175+
모든 함수는 기본적으로 `F.prototype = { constructor : F }`를 가지고 있으므로 `"constructor"` 프로퍼티를 사용하면 객체의 생성자를 얻을 수 있습니다.

0 commit comments

Comments
 (0)