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
`Object.prototype`위의 체인에는 더 이상`[[Prototype]]`이 없는 점을 알아두세요.
39
+
그런데 이때 `Object.prototype`위의 체인엔 `[[Prototype]]`이 없다는 점을 주의하셔야 합니다.
40
40
41
41
```js run
42
42
alert(Object.prototype.__proto__); // null
43
43
```
44
44
45
45
## 다른 내장 프로토타입
46
46
47
-
`Array`, `Date`, `Function`을 포함한 다른 내장 객체들 또한 메서드를 프로토타입 안에 유지합니다.
47
+
`Array`, `Date`, `Function`을 비롯한 내장 객체들 역시 프로토타입에 메서드를 저장해 놓습니다.
48
48
49
-
예를 들면 배열`[1, 2, 3]` 을 생성할 때 기본 `new Array()`생성자는 내부적으로 사용됩니다. 그래서`Array.prototype`이 프로토타입이 되고 메서드를 제공하게 됩니다. 이는 상당히 메모리 효율적입니다.
49
+
배열 `[1, 2, 3]`을 만들면 기본 `new Array()`생성자가 내부에서 사용되기 때문에`Array.prototype`이 배열 `[1, 2, 3]`의 프로토타입이 되죠. `Array.prototype`은 배열 메서드도 제공합니다. 이런 내부 동작은 메모리 효율을 높여주는 장점을 가져다줍니다.
50
50
51
-
구체적으로 모든 내장 프로토타입은 `Object.prototype`을 가장 위에 가집니다. 이 때문에 몇몇 사람들은 "모든 것은 객체로부터 온다"라고 말합니다.
51
+
명세서에선 모든 내장 프로토타입의 꼭대기엔 `Object.prototype`이 있어야 한다고 규정합니다. 이런 규정 때문에 몇몇 사람들은 "모든 것은 객체를 상속받는다."라는 말을 하죠.
몇몇 프로토타입의 메서드가 중복이 될 수도 있습니다. 예를 들어 `Array.prototype`은 쉼표를 통해 구분된 요소들을 나열하는 자기 자신의 `toString`를 가집니다.
72
+
체인 상의 프로토타입엔 중복 메서드가 있을 수 있습니다. `Array.prototype`엔 요소 사이에 쉼표를 넣어 요소 전체를 합친 문자열을 반환하는 자체 메서드 `toString`가 있습니다.
73
73
74
74
```js run
75
75
let arr = [1, 2, 3]
76
76
alert(arr); // 1,2,3 <-- Array.prototype.toString 의 결과
77
77
```
78
78
79
-
전에 보았던 대로, `Object.prototype` 또한`toString`을 가지고 있습니다. 그러나 `Array.prototype`이 체인에 더 가깝기 때문에 Array의 toString이 사용되었습니다.
79
+
그런데 `Object.prototype`에도 메서드`toString`이 있습니다. 이렇게 중복 메서드가 있을 때는 체인 상에서 가까운 곳에 있는 메서드가 사용됩니다. `Array.prototype`이 체인 상에서 더 가깝기 때문에 `Array.prototype`의 `toString`이 사용되죠.
80
80
81
81
82
82

83
83
84
84
85
-
Chrome 개발자 콘솔과 같은 브라우저 툴 내에서는 상속을 보여줍니다.(`console.dir`는 아마 내장 객체를 사용하기 위해 필요합니다.)
85
+
Chrome 개발자 콘솔과 같은 도구를 사용하면 상속 관계를 확인할 수 있습니다. `console.dir`를 사용하면 내장 객체의 상속 관계를 확인하는 데 도움이 됩니다.
86
86
87
87

88
88
89
-
다른 내장 객체들 또한 같은 방법으로 동작합니다. 심지어 내장 `Function`의 객체 함수 생성자와 메서드(`call`/`apply` 등등)들도 `Fuction.prototype`으로 부터 가져옵니다. 함수 또한 자기 자신의`toString`를 가지고 있습니다.
89
+
배열이 아닌 다른 내장 객체들 또한 같은 방법으로 동작합니다. 함수도 마찬가지이죠. 함수는 내장 객체 `Function`의 생성자를 사용해 만들어지는데 `call`, `apply`를 비롯한 함수에서 사용할 수 있는 메서드는 `Fuction.prototype`에서 가져옵니다. 함수에도 `toString`이 구현되어 있습니다.
90
90
91
91
```js run
92
92
functionf() {}
93
93
94
94
alert(f.__proto__==Function.prototype); // true
95
-
alert(f.__proto__.__proto__==Object.prototype); // true, inherit from objects
기억하다시피 이것들은 객체가 아닙니다. 그러나 그들의 프로퍼티에 접근하려고 시도한다면 내장 생성자 `String`, `Number`, `Boolean`을 사용하는 임시 래퍼 객체가 생성되며 메서드를 제공하고 사라집니다.
102
+
문자열과 숫자 불린값은 객체가 아닙니다. 그런데 이런 원시값들의 프로퍼티에 접근하려고 하면 내장 생성자 `String`, `Number`, `Boolean`을 사용하는 임시 래퍼 객체가 생성됩니다. 임시 래퍼 객체는 이런 메서드를 제공하고 난 후에 사라집니다.
103
103
104
-
이러한 객체들은 눈에 보이지 않게 생성되고 대부분의 엔진은 이를 최적화합니다. 명세서에도 이처럼 묘사됩니다. 객체들의 메서드는 `String.prototype`, `Number.prototype`, `Boolean.prototype`처럼 사용할 수 있는 프로토타입 안에 존재합니다.
104
+
래퍼 객체는 보이지 않는 곳에서 만들어집니다. 최적화는 엔진이 담당하죠. 그런데 명세서에선 각 자료형에 해당하는 래퍼 객체의 메서드를 프로토타입 안에 구현해 놓고 `String.prototype`, `Number.prototype`, `Boolean.prototype`을 사용해 쓸 수 있도록 규정합니다.
105
105
106
-
```warn header="`null`과 `undefined`의 값은 객체 래퍼를 가지지 않습니다."
107
-
특수한 값인 `null`과 `undefined`는 다른 것과는 거리가 있습니다. 객체 래퍼가 없기 때문에 메서드와 프로퍼티를 이용할 수 없습니다. 그리고 해당하는 프로퍼티도 존재하지 않습니다.
106
+
```warn header="`null`과 `undefined`에 대응하는 래퍼 객체는 없습니다."
107
+
특수 값인 `null`과 `undefined`는 문자열과 숫자 불린값과는 거리가 있습니다. `null`과 `undefined`에 대응하는 래퍼 객체는 없죠. 따라서 `null`과 `undefined`에선 메서드와 프로퍼티를 이용할 수 없습니다. 프로토타입도 물론 사용할 수 없습니다.
108
108
```
109
109
110
-
## 네이티브 프로토타입 변경[#native-prototype-change]
110
+
## 네이티브 프로토타입 변경하기[#native-prototype-change]
111
111
112
-
네이티브 프로토타입은 변경될 수 있습니다. 예를 들어 메서드를 `String.prototype`에 추가한다면 모든 문자열에서 `String.prototype`을 사용할 수 있습니다.
112
+
네이티브 프로토타입을 수정할 수 있습니다. `String.prototype`에 메서드를 하나 추가하면 모든 문자열에서 해당 메서드를 사용할 수 있죠.
- 원시값 또한 객체 래퍼의 프로토타입 안에 `Number.prototype`, `String.prototype`, `Boolean.prototype`과 같은 메서드를 저장합니다. `undefined`와 `null`값만 객체 래퍼를 가지지 않습니다.
196
-
- 내장 프로토타입은 수정 가능하며 새로운 메서드와 함께 값을 가져올 수 있습니다. 그러나 내장 프로토타입을 변경하는 것을 추천하진 않습니다. 아마 새로운 표준을 추가하려고 할 때 만 가능합니다. 그러나 이는 자바스크립트 엔진 메서드에서는 아직 지원하지 않습니다.
194
+
- 객체 자체엔 데이터만 저장합니다(배열의 요소, 객체의 프로퍼티, 날짜 등).
195
+
- 원시값 또한 래퍼 객체의 프로토타입에 `Number.prototype`, `String.prototype`, `Boolean.prototype` 같은 메서드를 저장합니다. `undefined`와 `null`값은 래퍼 객체 래퍼를 가지지 않습니다.
196
+
- 내장 프로토타입을 수정할 수 있습니다. 내장 프로토타입의 메서드를 빌려와 새로운 메서드를 만드는 것 역시 가능합니다. 그러나 내장 프로토타입 변경은 되도록 하지 않아야 합니다. 내장 프로토타입은 새로 명세서에 등록된 기능을 사용하고 싶은데 자바스크립트 엔진엔 이 기능이 구현되어있지 않을 때만 변경하는 게 좋습니다.
0 commit comments