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
`arr`은또한,`Object` class에 속해있다는 것을 기억하세요.`Array`는원래`Object`를상속하고 있습니다.
47
+
위 예시에서`arr`은클래스`Object`에도 속한다는 점에 주목해주시기 바랍니다.`Array`는프로토타입 기반으로`Object`를상속받습니다.
48
48
49
-
보통,`instanceof` 연산자는 프로토타입체인의확인을검사해줍니다. 또한,정적 메서드`Symbol.hasInstance`로 커스텀로직을설정할수 있습니다.
49
+
`instanceof` 연산자는보통,프로토타입체인을 사용해확인을진행합니다.정적 메서드`Symbol.hasInstance`을 사용하면 직접 검사로직을설정할 수도 있습니다.
50
50
51
-
`obj instanceof Class`의 알고리즘은 대략적으로 다음과 같이 동작합니다.
51
+
`obj instanceof Class`는 대략 아래와 같은 알고리즘으로 동작합니다.
52
52
53
-
1. 정적 메서드`Symbol.hasInstance`가있다고 가정한다면, 그저 호출하면 됩니다.`Class[Symbol.hasInstance](obj)`.결과는`true`나`false`값을 반환할 것입니다. 다음은`instanceof`를 어떻게 커스텀 하는지에 대한 예시입니다.
53
+
1.클래스에정적 메서드`Symbol.hasInstance`가구현되어 있으면`Class[Symbol.hasInstance](obj)`를 호출합니다. 호출결과는`true`나`false`이어야 합니다. 이렇게 하면`instanceof`의 검사 로직을 커스터마이징 할 수 있습니다.
`Class`생성자 그 자체는 확인할 수 없지만, 오직 프르토타입체인과`Class.prototype`은 매우 중요하므로 확인해야 합니다.
108
+
`isPrototypeOf`는`Class`생성자를 포함하지 않고 검사하는 점이 조금 특이합니다. 검사 시 프로토타입체인과`Class.prototype`만 고려하죠.
109
109
110
-
언제`prototype`프로퍼티가 객체가 생성된 후에 변화되는지에 따라 흥미로운결과를이끌어 낼수 있습니다.
110
+
`isPrototypeOf`의 이런 특징은 객체 생성 후`prototype` 프로퍼티가 변경되면 특이한결과를초래하기도 합니다. 아래와 같이 말이죠.
111
111
112
-
아래와 같이 말이죠.
112
+
예시:
113
113
114
114
```js run
115
115
function Rabbit() {}
116
116
let rabbit = new Rabbit();
117
117
118
-
//프로토타입을 변형했습니다.
118
+
//프로토타입이 변경됨
119
119
Rabbit.prototype = {};
120
120
121
-
//...더이상 Rabbit이 아닙니다!
121
+
//더 이상 Rabbit이 아닙니다!
122
122
*!*
123
123
alert( rabbit instanceof Rabbit ); // false
124
124
*/!*
125
125
```
126
126
127
-
## 보너스:타입을 위한Object.prototype.toString
127
+
## 보너스:타입 확인을 위한Object.prototype.toString
128
128
129
-
이미 여러분들은 평범한 객체들이`[object Object]`의 문자열로 변환되는 것에 대해알고있습니다.
129
+
일반 객체를 문자열로 변화하면`[object Object]`가 된다는 것을알고계실 겁니다.
130
130
131
131
```js run
132
132
let obj = {};
133
133
134
134
alert(obj); // [object Object]
135
-
alert(obj.toString()); //같습니다.
135
+
alert(obj.toString()); //같은 결과가 출력됨
136
136
```
137
137
138
-
그것은 바로`toString`으로 구현되어 있습니다. 그러나`toString`은 실질적으로 그것이 가진 기능보다더 강력하게만들어 줄 수 있는 몇 가지 숨겨진 특징들이 있습니다. 확장된 기능으로써`typeof`을 사용할수 있는데, 이것은`instanceof` 대신 사용할 수 있습니다.
138
+
이렇게`[object Object]`가 되는 이유는`toString`의 구현방식 때문입니다. 그런데`toString`엔`toString`을더 강력하게만들어주는 기능이 숨겨져 있습니다.We can use it as an extended`typeof` and an alternativefor`instanceof`.
139
139
140
-
이상하게들리나요? 그럼 미스터리로 두죠.
140
+
이상하게들리시겠지만, 미스터리를 파헤쳐보도록 하겠습니다.
141
141
142
-
[이곳](https://tc39.github.io/ecma262/#sec-object.prototype.tostring)에명시되어 있듯이, 객체와 실행중인 다른 값의 컨텍스트로부터 내장함수 `toString`을 사용하여 추출할수 있습니다.그리고 그 결과는그 객체가 가진 값에 의존합니다.
142
+
[명세서](https://tc39.github.io/ecma262/#sec-object.prototype.tostring)에따르면, 내장 `toString`을 객체에서 추출하는 게 가능합니다. 그리고 이렇게 추출한 메서드는 어떤 값에도 실행할수 있습니다.값별 호출 결과는다음과 같습니다.
143
143
144
-
-숫자의 경우, 그것은`[object Number]`가 될 것입니다.
145
-
-불린의 경우, 그것은`[object Boolean]`이 될 것입니다.
146
-
-null의 경우, 그것은`[object Null]`가 될 것입니다.
147
-
-`undefined`의 경우, 그것은`[object Undefined]`가 될 것입니다.