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/09-classes/06-instanceof/article.md
+20-20Lines changed: 20 additions & 20 deletions
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
3
3
O operador `instanceof` permite checar se um objeto pertence a uma determinada classe. Também leva a herança em consideração.
4
4
5
-
Essa verificação pode ser necessário em diversos casos. Por exemplo, pode ser usada para construir uma função *polimórfica*, aquela que lida com argumentos de forma diferente dependendo do seu tipo.
5
+
Essa verificação pode ser necessária em diversos casos. Por exemplo, pode ser usada para construir uma função *polimórfica*, aquela que lida com argumentos de forma diferente dependendo do seu tipo.
6
6
7
7
## O operador instanceof [#ref-instanceof]
8
8
@@ -19,7 +19,7 @@ Por exemplo:
19
19
classRabbit {}
20
20
let rabbit =newRabbit();
21
21
22
-
//É um objeto da classe Rabbit?
22
+
//é um objeto da classe Rabbit?
23
23
*!*
24
24
alert( rabbit instanceof Rabbit ); // true
25
25
*/!*
@@ -29,14 +29,14 @@ Também funciona com funções construtoras:
29
29
30
30
```js run
31
31
*!*
32
-
//Ao invés de class
32
+
//ao invés de class
33
33
functionRabbit() {}
34
34
*/!*
35
35
36
36
alert( newRabbit() instanceof Rabbit ); // true
37
37
```
38
38
39
-
...E também com classes nativas como `Array`:
39
+
...E também com classes nativas como `Array`:
40
40
41
41
```js run
42
42
let arr = [1, 2, 3];
@@ -50,13 +50,13 @@ Normalmente `instanceof` examina a cadeia de protótipos para a verificação. T
50
50
51
51
O algoritmo de `obj instanceof Class` funciona mais ou menos da seguinte forma:
52
52
53
-
1. Se houver um método estático `Symbol.hasInstance`, basta chamá-lo: `Class[Symbol.hasInstance](obj)`. Ele deve retornar `true` ou `false`, basicamente. É assim que podemos customizar o comportamento de `instanceof`.
53
+
1. Se houver um método estático `Symbol.hasInstance`, basta executá-lo como: `Class[Symbol.hasInstance](obj)`. Ele deve retornar `true` ou `false`, e é tudo. É assim que podemos customizar o comportamento de `instanceof`.
54
54
55
55
Por exemplo:
56
56
57
57
```js run
58
58
// configura a verificação de instanceOf para assumir que
59
-
// qualquer coisa com a propriedade canEat é uma animal
59
+
// qualquer coisa com a propriedade canEat é um animal
60
60
classAnimal {
61
61
static [Symbol.hasInstance](obj) {
62
62
if (obj.canEat) returntrue;
@@ -65,7 +65,7 @@ O algoritmo de `obj instanceof Class` funciona mais ou menos da seguinte forma:
65
65
66
66
let obj = { canEat:true };
67
67
68
-
alert(obj instanceof Animal); // true: Animal[Symbol.hasInstance](obj) is called
68
+
alert(obj instanceof Animal); // true: Animal[Symbol.hasInstance](obj) é executado
69
69
```
70
70
71
71
2.A maioria das classes não possui `Symbol.hasInstance`. Nesse caso, a lógica padrão é usada:`obj instanceOf Class` verfica se `Class.prototype` é igual a um dos protótipos na cadeia de protótipos de `obj`.
@@ -93,19 +93,19 @@ O algoritmo de `obj instanceof Class` funciona mais ou menos da seguinte forma:
93
93
alert(rabbit instanceof Animal); // true
94
94
*/!*
95
95
96
-
// rabbit.__proto__ === Animal.prototype (no match)
96
+
// rabbit.__proto__ === Animal.prototype (sem correspondência)
Aqui está a ilustração de que `rabbit instanceof Animal`compara com `Animal.prototype`
102
+
Aqui está a ilustração do que `rabbit instanceof Animal`vai comparar com `Animal.prototype`
103
103
104
104

105
105
106
-
A propósito, também existe um método [objA.isPrototypeOf(objB)](mdn:js/object/isPrototypeOf), que retorna `true` se `objA` está em algum lugar na cadeia de protótipos para`objB`. Então o teste de `obj instanceof Class` pode ser reescrito como `Class.prototype.isPrototypeOf(obj)`.
106
+
A propósito, também existe um método [objA.isPrototypeOf(objB)](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf), que retorna `true` se `objA` está em algum lugar na cadeia de protótipos do `objB`. Então o teste de `obj instanceof Class` pode ser reescrito como `Class.prototype.isPrototypeOf(obj)`.
107
107
108
-
É engraçado, mas o próprio construtor `Class` não participa da verificação! Apenas a cadeia de protótipos e `Class.prototype`importa.
108
+
É engraçado, mas o próprio construtor `Class` não participa na verificação! Apenas a cadeia de protótipos e `Class.prototype`importam.
109
109
110
110
Isso pode levar a consequências interessantes quando uma propriedade `prototype` é alterada depois que um objeto é criado.
Já sabemos que objetos simples são convertidos para string como`[object Object]`:
129
+
Já sabemos que objetos simples convertidos para string exibem o texto`[object Object]`:
130
130
131
131
```js run
132
132
let obj = {};
@@ -139,7 +139,7 @@ Essa é a implementação deles de `toString`. Porém, há uma característica e
139
139
140
140
Soa estranho? De fato. Vamos desmistificar.
141
141
142
-
Pela [especificação](https://tc39.github.io/ecma262/#sec-object.prototype.tostring), o `toString` nativo pode ser extraído do objeto executado no contexto de qualquer outro valor. E o seu resultado depende desse valor.
142
+
Pela [especificação](https://tc39.github.io/ecma262/#sec-object.prototype.tostring), o `toString` nativo pode ser extraído do objeto e executado no contexto de qualquer outro valor. E o seu resultado depende desse valor.
Aqui usamos [call](mdn:js/function/call) como descrito no capítulo [](info:call-apply-decorators) para executar a função `objectToString` no contexto `this=arr`.
163
+
Aqui usamos [call](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Function/call) como descrito no capítulo [](info:call-apply-decorators) para executar a função `objectToString` no contexto `this=arr`.
164
164
165
165
Internamente, o algoritmo `toString` examina `this` e retorna o resultado correspondente. Mais exemplos:
166
166
@@ -186,26 +186,26 @@ let user = {
186
186
alert( {}.toString.call(user) ); // [object User]
187
187
```
188
188
189
-
Para a maioria dos objetos específicos do ambiente, existe essa propriedade. Aqui estão alguns exemplos específicos do navegadore.
189
+
Para a maioria dos objetos nativos aos diversos ambientes, existe essa propriedade. Aqui estão alguns exemplos específicos donavegador:
190
190
191
191
```js run
192
-
// toStringTag para o objeto e classes específicos do ambiente:
192
+
// toStringTag para o objeto e a classe nativos ao ambiente:
Como pode ver, o resultado é exatamente `Symbol.toStringTag` (Se existir), agrupado em`[object ...]`.
200
+
Como pode ver, o resultado é exatamente `Symbol.toStringTag` (Se existir), dentro de`[object ...]`.
201
201
202
202
No final, temos "typeof com esteróides" que não funciona apenas para dados primitivos, mas também para objetos nativos e pode até mesmo ser personalizado.
203
203
204
-
Podemos usar `{}.toString.call` ao invés de `{}.toString.call` para objetos nativos quando queremos obter o tipo como uma string em vez de apenas verificar.
204
+
Podemos usar `{}.toString.call` ao invés de `instanceof` para objetos nativos quando queremos obter o tipo como uma string em vez de apenas verificar.
205
205
206
206
## Conclusão
207
207
208
-
Vamos listar os métodos de checagem de tipos que conhecemos
208
+
Vamos listar os métodos de checagem de tipos que conhecemos:
0 commit comments