Skip to content

Commit 6e1325f

Browse files
[함수의 prototype 프로퍼티] 개선
1 parent 13852a3 commit 6e1325f

File tree

1 file changed

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

1 file changed

+16
-16
lines changed

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

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

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

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

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

13-
생성자 함수의 프로토타입을 의미하는 `F.prototype`에서 `"prototype"``F`에 정의된 일반 프로퍼티라는 점에 주의해 글을 읽어 주시기 바랍니다. `F.prototype`에서 `"prototype"`은 바로 앞에서 배운 '프로토타입'과 비슷하게 들리겠지만 이름만 같을 뿐 실제론 다른 일반 프로퍼티입니다.
13+
생성자 함수(`F`)의 프로토타입을 의미하는 `F.prototype`에서 `"prototype"``F`에 정의된 일반 프로퍼티라는 점에 주의해 글을 읽어 주시기 바랍니다. `F.prototype`에서 `"prototype"`은 바로 앞에서 배운 '프로토타입'과 비슷하게 들리겠지만 이름만 같을 뿐 실제론 다른 우리가 익히 알고있는 일반적인 프로퍼티입니다.
1414

1515
예시:
1616

@@ -32,7 +32,7 @@ let rabbit = new Rabbit("흰 토끼"); // rabbit.__proto__ == animal
3232
alert( rabbit.eats ); // true
3333
```
3434

35-
`Rabbit.prototype = animal`은 "`new Rabbit`을 호출해 만든 새로운 객체의 `[[Prototype]]``animal`로 설정하라."라는 것을 의미합니다.
35+
`Rabbit.prototype = animal`은 "`new Rabbit`을 호출해 만든 새로운 객체의 `[[Prototype]]``animal`로 설정하라." 것을 의미합니다.
3636

3737
그림으로 나타내면 다음과 같습니다.
3838

@@ -41,23 +41,23 @@ alert( rabbit.eats ); // true
4141
여기서 가로 화살표는 일반 프로퍼티인 `"prototype"`을, 세로 화살표는 `[[Prototype]]`을 나타냅니다. 세로 화살표는 `rabbit``animal`을 상속받았다는 것을 의미합니다.
4242

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

46-
새로운 객체가 만들어진 후에 `F.prototype` 프로퍼티가 바뀌면(`F.prototype = <another object>`) `new F`로 만들어지는 또 다른 새로운 객체는 <another object>를 `[[Prototype]]`으로 갖게 됩니다. 다만, 기존에 있던 객체의 `[[Prototype]]`은 그대로 유지됩니다.
46+
새로운 객체가 만들어진 후에 `F.prototype` 프로퍼티가 바뀌면(`F.prototype = <another object>`) `new F`를 호출해 만드는 또 다른 새로운 객체는 <another object>를 `[[Prototype]]`으로 갖게 됩니다. 다만, 기존에 있던 객체의 `[[Prototype]]`은 그대로 유지됩니다.
4747
```
4848
4949
## 함수의 디폴트 프로퍼티 prototype과 constructor 프로퍼티
5050
51-
개발자가 특별히 할당하지 않더라도 모든 함수는 `"prototype"` 프로퍼티를 갖습니다.
51+
개발자가 특별히 할당하지 않더라도 모든 함수는 기본적으로 `"prototype"` 프로퍼티를 갖습니다.
5252
53-
이 기본 프로퍼티 `"prototype"`은 `constructor` 프로퍼티 하나만 있는 객체를 가리키는데, 여기서 `constructor` 프로퍼티는 함수 자신을 가리킵니다.
53+
디폴트(지정하지 않아도 자동으로 선택되는 무언가 – 옮긴이) 프로퍼티 `"prototype"`은 `constructor` 프로퍼티 하나만 있는 객체를 가리키는데, 여기서 `constructor` 프로퍼티는 함수 자신을 가리킵니다.
5454
5555
이 관계를 코드와 그림으로 나타내면 다음과 같습니다.
5656
5757
```js
5858
function Rabbit() {}
5959
60-
/* 기본 prototype
60+
/* 디폴트 prototype
6161
Rabbit.prototype = { constructor: Rabbit };
6262
*/
6363
```
@@ -68,13 +68,13 @@ Rabbit.prototype = { constructor: Rabbit };
6868

6969
```js run
7070
function Rabbit() {}
71-
// 기본 prototype:
71+
// 함수를 만들기만 해도 디폴트 프로퍼티인 prototype이 설정됩니다.
7272
// Rabbit.prototype = { constructor: Rabbit }
7373

7474
alert( Rabbit.prototype.constructor == Rabbit ); // true
7575
```
7676

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

7979
```js run
8080
function Rabbit() {}
@@ -129,7 +129,7 @@ alert(rabbit.constructor === Rabbit); // false
129129
*/!*
130130
```
131131

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

134134
```js
135135
function Rabbit() {}
@@ -150,21 +150,21 @@ Rabbit.prototype = {
150150
*/!*
151151
};
152152

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

156156

157157
## 요약
158158

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

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

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

167-
일반 객체엔 `"prototype"` 프로퍼티를 추가해도 아무런 일이 일어나지 않습니다.
167+
참고로 일반 객체엔 `"prototype"` 프로퍼티를 추가해도 아무런 일이 일어나지 않습니다.
168168
```js
169169
let user = {
170170
name: "John",

0 commit comments

Comments
 (0)