freeCodeCamp/curriculum/challenges/portuguese/02-javascript-algorithms-an.../object-oriented-programming/use-closure-to-protect-prop...

82 lines
2.4 KiB
Markdown
Raw Normal View History

---
id: 587d7db2367417b2b2512b8a
title: >-
Usar closure para evitar que propriedades de um objeto sejam modificadas externamente
challengeType: 1
forumTopicId: 18234
dashedName: >-
use-closure-to-protect-properties-within-an-object-from-being-modified-externally
---
# --description--
No desafio anterior, `bird` possuía uma propriedade pública `name`. É considerado publico porque ele pode ser acessado e modificado fora da definição de `bird`.
```js
bird.name = "Duffy";
```
Portanto, qualquer parte do seu código pode facilmente alterar o nome do `bird` para qualquer valor. Pense sobre coisas como senhas e contas de banco sendo facilmente modificáveis em qualquer parte do seu código. Isso poderia causar inúmeros problemas.
A forma mais simples para tornar essa propriedade pública em privada, seria criando uma variável dentro da função constructor. Isso alteraria o escopo daquela variável para ser apenas o escopo da função construtora ao invés de globalmente disponível. Dessa maneira, a variável pode ser acessada e modificada apenas pelos métodos dentro da função construtora.
```js
function Bird() {
let hatchedEgg = 10;
this.getHatchedEggCount = function() {
return hatchedEgg;
};
}
let ducky = new Bird();
ducky.getHatchedEggCount();
```
Aqui `getHatchedEggCount` é um método privilegiado, porque ele possui acesso à variável privada `hatchedEgg`. Isso é possível porque `hatchedEgg` é declarado no mesmo contexto que `getHatchedEggCount`. Em JavaScript, a função sempre possui acesso ao contexto na qual foi criada. Isso é chamado de `closure`.
# --instructions--
Modifique como `weight` é declarado na função `Bird` para que seja uma variável privada. Em seguida, crie o método `getWeight` que retorna o valor de `weight` 15.
# --hints--
A propriedade `weight` deve ser uma variável privada e deve ser atribuída a ela o valor `15`.
```js
assert(code.match(/(var|let|const)\s+weight\s*\=\s*15\;?/g));
```
O código deve criar o método dentro de `Bird` chamado `getWeight` que retorna o valor da variável privada `weight`.
```js
assert(new Bird().getWeight() === 15);
```
A função `getWeight` deve retornar a variável privada `weight`.
```js
assert(code.match(/((return\s+)|(\(\s*\)\s*\=\>\s*))weight\;?/g));
```
# --seed--
## --seed-contents--
```js
function Bird() {
this.weight = 15;
}
```
# --solutions--
```js
function Bird() {
let weight = 15;
this.getWeight = () => weight;
}
```