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/08-prototypes/03-native-prototypes/article.md
+26-26
Original file line number
Diff line number
Diff line change
@@ -1,27 +1,27 @@
1
1
# Protótipos Nativos
2
2
3
-
A propriedade `"prototype"` é comumente utilizada pelo núcleo do próprio JavaScript. Toda função construtora embutida a usa.
3
+
A propriedade `"prototype"` é amplamente utilizada pelo próprio núcleo do JavaScript. Todas as funções construtoras integradas o utilizam.
4
4
5
-
First we'll look at the details, and then how to use it for adding new capabilities to built-in objects.
5
+
Primeiro veremos os detalhes e depois como usá-lo para adicionar novos recursos a objetos integrados.
6
6
7
7
## Object.prototype
8
8
9
-
Digamos que a gente imprima um objeto vazio:
9
+
Digamos que produzimos um objeto vazio:
10
10
11
11
```js run
12
12
let obj = {};
13
13
alert( obj ); // "[object Object]" ?
14
14
```
15
15
16
-
Onde está o código que gera a string `"[object Object]"`? Isso é um método embutido `toString`, mas onde ele está? O `obj` está vazio!
16
+
Onde está o código que gera a string `"[object Object]"`? Isto vem de um método embutido `toString`, mas onde ele está? O `obj` está vazio!
17
17
18
-
... Mas a notação abreviada `obj = {}` é o mesmo que `obj = new Object()`, onde`Object` é uma função construtora embutida, com seu próprio `prototype` referenciando um objeto enorme com`toString` e outros métodos.
18
+
... A notação abreviada `obj = {}` é o mesmo que `obj = new Object()`. Onde`Object` é uma função construtora embutida, com o seu próprio `prototype` referenciando um objeto enorme, possuindo`toString` e outros métodos.
19
19
20
20
Veja o que está acontecendo:
21
21
22
22

23
23
24
-
Quando `new Object()` é chamado (ou um objeto literal `{...}` é criado), o seu `[[Prototype]]` é configurado para o `Object.prototype` de acordo com a regra que nós discutimos no capítulo anterior:
24
+
Quando `new Object()` é invocado (ou um objeto literal `{...}` é criado), o seu `[[Prototype]]` é configurado para o `Object.prototype`, de acordo com a regra que nós discutimos no capítulo anterior:
Please note that there is no more `[[Prototype]]`in the chain above`Object.prototype`:
41
+
Observe que não há mais `[[Prototype]]`na cadeia acima de`Object.prototype`:
42
42
43
43
```js run
44
44
alert(Object.prototype.__proto__); // null
45
45
```
46
46
47
47
## Outros protótipos embutidos
48
48
49
-
Outros objetos embutidos, como `Array`, `Date`, `Function`, entre outros, também mantém métodos nos seus protótipos.
49
+
Outros objetos embutidos, como `Array`, `Date`, `Function`, etc., também têm métodos nos seus protótipos.
50
50
51
-
For instance, when we create an array `[1, 2, 3]`, the default `new Array()`constructor is used internally. So`Array.prototype`becomes its prototype and provides methods. That's very memory-efficient.
51
+
Por exemplo, quando criamos um array `[1, 2, 3]`, o construtor padrão `new Array()`é usado internamente. Então`Array.prototype`se torna seu protótipo e fornece métodos. Isso é muito eficiente em termos de memória.
52
52
53
-
By specification, all of the built-in prototypes have `Object.prototype`on the top. That's why some people say that "everything inherits from objects".
53
+
Por especificação, todos os protótipos integrados têm `Object.prototype`no topo. É por isso que algumas pessoas dizem que “tudo herda dos objetos”.
54
54
55
55
Aqui temos uma visão geral (para 3 protótipos embutidos):
@@ -84,11 +84,11 @@ Como vimos antes, `Object.prototype` também tem o método `toString`, mas `Arra
84
84

85
85
86
86
87
-
Ferramentas embutidas em navegadores, como o console do desenvolvedor no Chrome, também mostram herança (objetos embutidos podem precisar de usar o`console.dir`):
87
+
Ferramentas embutidas em navegadores, como o console do desenvolvedor no Chrome, também mostram herança (para objetos embutidos pode ser preciso usar `console.dir`):
88
88
89
89

90
90
91
-
Outros objetos embutidos também trabalham da mesma forma. Até mesmo funções -- elas são objetos de um construtor `Function` embutido, e seus métodos (`call`/`apply` e outros) são obtidos de `Function.prototype`. Funções também têm seu próprio `toString`.
91
+
Outros objetos embutidos também trabalham da mesma forma. Até mesmo funções -- elas são objetos de um construtor `Function` embutido, e os seus métodos (`call`/`apply`, e outros) são obtidos de `Function.prototype`. Funções também têm o seu próprio `toString`.
As coisas mais complicadas acontecem com strings, números e boleanos.
103
103
104
-
Como sabemos, eles não são objetos. Mas se nós tentarmos acessar as propriedades deles, temporariamente são criados objetos que contém os construtores embutidos `String`, `Number` and `Boolean`. Eles fornecem os métodos e disaparecem.
104
+
Como sabemos, eles não são objetos. Mas se nós tentarmos acessar as propriedades deles, temporariamente são criados objetos usando os construtores embutidos `String`, `Number` and `Boolean`. Esses objetos fornecem os métodos e desaparecem.
105
105
106
-
Esses objetos são criados invisivelmente para nós e a maioria dos interpretadores (*engines*) otimizam esse processo, apesar da especificação descrevê-lo exatamente dessa forma. Os métodos desses objetos também residem nos protótipos, disponíveis como `String.prototype`, `Number.prototype` e `Boolean.prototype`.
106
+
Esses objetos são criados invisivelmente para nós e a maioria dos interpretadores (*engines*) otimizam esse processo, apesar da especificação descrevê-lo exatamente desta forma. Os métodos desses objetos também residem nos protótipos, disponíveis como `String.prototype`, `Number.prototype` e `Boolean.prototype`.
107
107
108
108
```warn header="Os valores `null` e `undefined` não têm objetos que os envolvam"
109
109
O valores especiais `null` e `undefined` se destacam dos outros. Eles não têm objetos que os envolem, então métodos e propriedades não estão disponíveis para eles. Também não existem protótipos correspondentes.
Durante o processo do desenvolvimento, nós podemos ter novas ideias de métodos embutidos que nós gostaríamos de ter, e podemos ficar tentados a adicioná-los aos protótipos nativos. Mas isso é geralmente uma má ideia.
124
+
Durante o processo de desenvolvimento, nós podemos ter novas ideias de métodos embutidos que gostaríamos de ter, e podemos ficar tentados a adicioná-los aos protótipos nativos. Mas isso é geralmente uma má ideia.
125
125
126
126
```warn
127
-
Prototypes are global, so it's easy to get a conflict. If two libraries add a method `String.prototype.show`, then one of them will be overwriting the method of the other.
127
+
Os protótipos são globais, por isso é fácil criar conflitos. Se duas bibliotecas adicionarem um método `String.prototype.show`, então uma delas substituirá o método da outra.
128
128
129
129
Por isso, geralmente, modificar um protótipo nativo é considerado uma má ideia.
130
130
```
131
131
132
132
**Na programação moderna, existe apenas um caso erm que modificar protótipos nativos é aprovado: fazer polyfill (polyfilling).**
133
133
134
-
*Polyfill* é um termpo para criar um substituto para um método que existe na especificação do JavaScript, mas ainda não tem suporte em algum interpretador particular de JavaScript.
134
+
*Polyfill* é um termo para criar um substituto para um método que existe na especificação, mas que ainda não tem suporte em um particular interpretador de JavaScript.
135
135
136
-
Nesse caso nós podemos implementar e preencher o protótipo embutido com ele.
136
+
Nesse caso nós o podemos implementar e preencher o protótipo embutido com ele.
Ele funciona porque o algoritmo interno do método `join` embutido só precisa dos índices corretos e da propriedade `length`. Ele não confere se o objeto é de fato uma array. Muitos métodos enbutidos são assim.
185
185
186
-
Outra possibilidade é herdar configurando `obj.__proto__` para `Array.prototype`, de forma que todos os métodos de `Array` fiquem automaticamente disponíveis em `obj`.
186
+
Outra possibilidade é herdando, configurando `obj.__proto__` para `Array.prototype`, de forma que todos os métodos de `Array` fiquem automaticamente disponíveis em `obj`.
187
187
188
188
Mas isso é impossível se `obj` já herda de outro objeto. Lembre-se, nós só podemos herdar de um objeto por vez.
189
189
190
-
Pegar métodos emprestado é mais flexível, isso permite misturar as funcionalidades de diferentes objetos caso necessário.
190
+
Pegar métodos emprestados é mais flexível, isso permite misturar as funcionalidades de diferentes objetos caso necessário.
191
191
192
192
## Resumo
193
193
194
-
- Todos os objetos enbutidos seguem o mesmo padrão:
194
+
- Todos os objetos embutidos seguem o mesmo padrão:
195
195
- Os métodos são guardados no protótipo (`Array.prototype`, `Object.prototype`, `Date.prototype`, etc.)
196
-
- O objeto só guarda os dados nele mesmo (itens de array, propriedades de objetos, a data)
196
+
- O objeto só guarda os dados nele mesmo (itens de array, propriedades de objetos, uma data)
197
197
- Tipos primitivos também guardam métodos em protótipos de objetos que os envolvem: `Number.prototype`, `String.prototype` e `Boolean.prototype`. Apenas `undefined` e `null` não tem objetos invólucros.
198
-
- Protótipos embutidos podem ser modificados ou populados com novos métodos. Mas modificá-los não é recomendado. O único caso aceitável é provavelmente quando nós adicionamos um novo comportamento e ele ainda não tem suporte em algum interpretador (*engine*) de JavaScript.
198
+
- Protótipos embutidos podem ser modificados ou populados com novos métodos. Mas modificá-los não é recomendado. O único caso aceitável, é provavelmente quando nós adicionamos um novo comportamento que ainda não tem suporte em algum interpretador (*engine*) de JavaScript.
0 commit comments