2.4 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
587d7db2367417b2b2512b8a | Usar closure para evitar que propriedades de um objeto sejam modificadas externamente | 1 | 18234 | 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
.
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.
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
.
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
.
assert(new Bird().getWeight() === 15);
A função getWeight
deve retornar a variável privada weight
.
assert(code.match(/((return\s+)|(\(\s*\)\s*\=\>\s*))weight\;?/g));
--seed--
--seed-contents--
function Bird() {
this.weight = 15;
}
--solutions--
function Bird() {
let weight = 15;
this.getWeight = () => weight;
}