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

2.6 KiB

id title challengeType forumTopicId dashedName
587d7db2367417b2b2512b8a Usare le closure per proteggere da modifiche esterne le proprietà di un oggetto 1 18234 use-closure-to-protect-properties-within-an-object-from-being-modified-externally

--description--

Nella sfida precedente, bird aveva una proprietà pubblica name. È considerata pubblica perché può essere consultata e modificata dal di fuori della definizione di bird.

bird.name = "Duffy";

Pertanto, qualsiasi parte del tuo codice può facilmente cambiare il nome di bird impostandolo a qualsiasi valore. Pensa a cosa succederebbe se cise come password e conti bancari fossero facilmente modificabili da qualsiasi parte del tuo codice. Questo potrebbe causare un sacco di problemi.

Il modo più semplice per rendere privata questa proprietà pubblica è quello di creare una variabile all'interno della funzione costruttore. Questo fa in modo che il campo di applicazione di questa variabile sia solo quello interno alla funzione costruttore, e non la rende più disponibile a livello globale. In questo modo, la variabile può essere consultata e modificata solo da metodi che siano anch'essi all'interno della funzione costruttore.

function Bird() {
  let hatchedEgg = 10;

  this.getHatchedEggCount = function() { 
    return hatchedEgg;
  };
}
let ducky = new Bird();
ducky.getHatchedEggCount();

getHatchedEggCount è un metodo privilegiato, perché ha accesso alla variabile privata hatchedEgg. Questo è possibile perché hatchedEgg è dichiarato nello stesso contesto di getHatchedEggCount. In JavaScript, una funzione ha sempre accesso al contesto in cui è stata creata. Questa si chiama closure (chiusura).

--instructions--

Cambia il modo in cui weight è dichiarata nella funzione Bird in modo che diventi una variabile privata. Quindi, crea un metodo getWeight che restituisca il valore di weight 15.

--hints--

La proprietà weight dovrebbe essere una variabile privata e dovrebbe avere il valore di 15.

assert(code.match(/(var|let|const)\s+weight\s*\=\s*15\;?/g));

Il tuo codice dovrebbe creare un metodo in Bird chiamato getWeight che restituisca il valore della variabile privata weight.

assert(new Bird().getWeight() === 15);

La funzione getWeight dovrebbe restituire la variabile privata 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;
}