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

2.6 KiB

id title challengeType forumTopicId dashedName
587d7db2367417b2b2512b8a Verwende Closure, um Eigenschaften innerhalb eines Objekts vor externen Änderungen zu schützen 1 18234 use-closure-to-protect-properties-within-an-object-from-being-modified-externally

--description--

In der vorherigen Aufgabe hatte bird eine öffentliche Eigenschaft name. Sie gilt als öffentlich, weil auf sie außerhalb der Definition von bird zugegriffen und sie verändert werden kann.

bird.name = "Duffy";

Deshalb kann jeder Teil deines Codes den Namen von bird einfach in einen beliebigen Wert ändern. Denk an Dinge wie Passwörter und Bankkonten, die von jedem Teil deiner Codebasis leicht geändert werden können. Das könnte eine Menge Probleme verursachen.

Der einfachste Weg, diese öffentliche Eigenschaft privat zu machen, ist die Erstellung einer Variablen innerhalb der Konstruktorfunktion. Dadurch ändert sich der Geltungsbereich der Variablen, sodass sie innerhalb der Konstruktorfunktion und nicht mehr global verfügbar ist. Auf diese Weise kann auf die Variable nur durch Methoden zugegriffen werden, die auch innerhalb der Konstruktorfunktion vorhanden sind.

function Bird() {
  let hatchedEgg = 10;

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

Hier ist getHatchedEggCount eine privilegierte Methode, weil sie Zugriff auf die private Variable hatchedEgg hat. Das ist möglich, weil hatchedEgg im gleichen Kontext deklariert wird wie getHatchedEggCount. In JavaScript hat eine Funktion immer Zugriff auf den Kontext, in dem sie erstellt wurde. Das nennt man closure.

--instructions--

Ändere die Deklaration von weight in der Funktion Bird, damit es eine private Variable ist. Erstelle dann eine Methode getWeight, die den Wert 15 von weight zurückgibt.

--hints--

Die Eigenschaft weight sollte eine private Variable sein und den Wert 15 zugewiesen bekommen.

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

Dein Code sollte eine Methode in Bird namens getWeight erstellen, die den Wert der privaten Variable weight zurückgibt.

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

Deine Funktion getWeight sollte die private Variable weight zurückgeben.

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;
}