Kursinhalt
Fortgeschrittene JavaScript-Meisterschaft
Fortgeschrittene JavaScript-Meisterschaft
Private Eigenschaften
In der klassenbasierten Programmierung gibt es oft Fälle, in denen Sie den direkten Zugriff auf bestimmte Eigenschaften einschränken möchten, um die Datenintegrität zu schützen und zu kontrollieren, wie sie geändert werden.
Was sind Private Eigenschaften?
In JavaScript sind Klassen-Eigenschaften typischerweise öffentlich, was bedeutet, dass sie von außerhalb der Klasse aus zugegriffen und geändert werden können. Es gibt jedoch Situationen, in denen Sie den Zugriff auf bestimmte Eigenschaften einschränken müssen, um sicherzustellen, dass sie nur innerhalb der Klasse selbst zugegriffen oder geändert werden können. Diese werden als private Eigenschaften bezeichnet.
Private Eigenschaften helfen dabei, eine klare Grenze zwischen den internen Abläufen der Klasse und externem Code zu schaffen. Sie sind nützlich, wenn Sie sensible Daten verbergen oder unbeabsichtigte Änderungen an einer Eigenschaft von außerhalb der Klasse verhindern möchten.
Denken Sie daran wie an den Motor eines Autos. Während Sie das Auto fahren und mit seinen Bedienelementen interagieren können, haben Sie während der Fahrt keinen direkten Zugriff auf seine Motorkomponenten. Der Motor ist vor äußerer Manipulation geschützt, und nur autorisierte Mechaniker (Klassenmethoden) können Anpassungen vornehmen.
Wie man Private Felder in einer Klasse deklariert und verwendet
In JavaScript werden private Eigenschaften mit der #
-Syntax (eingeführt in ES2020) deklariert. Durch das Voranstellen eines Eigenschaftsnamens mit #
machen Sie ihn privat, was bedeutet, dass darauf nur innerhalb der Klasse selbst zugegriffen werden kann.
class Animal { #type; // Declaring a private field constructor(name, type) { this.name = name; this.#type = type; // Assigning a value to the private field } getInfo() { return `${this.name} is a ${this.#type} animal.`; } changeType(newType) { this.#type = newType; // Modifying the private field within the class } } const lion = new Animal('Lion', 'Wild'); console.log(lion.getInfo()); // Output: Lion is a Wild animal // Attempt to access private field directly (this will cause an error) console.log(lion.#type); // Uncaught SyntaxError: Private field '#type' must be declared in an enclosing class
In diesem Beispiel ist #type
ein privates Feld. Es kann nicht außerhalb der Animal
-Klasse zugegriffen oder geändert werden. Jeder Versuch, direkt auf #type
von einer Instanz aus zuzugreifen (wie lion.#type
), führt zu einem Syntaxfehler. Dies stellt sicher, dass sensible oder kritische Daten nur durch kontrollierte Methoden geändert werden, die in der Klasse definiert sind.
Vorteile von privaten Eigenschaften
- Private Eigenschaften schützen sensible Daten, indem sie externen Zugriff verhindern. Sie stellen sicher, dass Daten nur durch spezifische Methoden geändert werden können, wodurch das Risiko von versehentlichen oder unbefugten Änderungen reduziert wird;
- Private Eigenschaften ermöglichen es Ihnen, Implementierungsdetails zu kapseln und die interne Logik vor dem Benutzer zu verbergen. Dies fördert eine saubere Trennung der Anliegen und hält Ihren Code modular;
- Mit privaten Eigenschaften haben Sie eine feinere Kontrolle darüber, wie Daten innerhalb einer Klasse zugegriffen und geändert werden, und stellen sicher, dass Änderungen durch gut definierte Methoden erfolgen.
Beispiel aus der realen Welt: Bankkonto
Nehmen wir ein Beispiel aus der realen Welt zur Verwaltung eines Bankkontostands. In einer Bank ist der Kontostand geschützt, und niemand kann direkt darauf zugreifen oder ihn ändern. Sie können nur über autorisierte Prozesse wie Einzahlungen und Abhebungen damit interagieren. Ähnlich können wir private Eigenschaften in einer Klasse verwenden, um das Feld für den Kontostand vor direktem Zugriff oder Änderungen zu schützen.
class BankAccount { #balance; // Private field constructor(owner, initialBalance) { this.owner = owner; this.#balance = initialBalance; } // Method to deposit money deposit(amount) { if (amount > 0) { this.#balance += amount; } } // Method to withdraw money withdraw(amount) { if (amount > 0 && amount <= this.#balance) { this.#balance -= amount; } } // Method to get account balance getBalance() { return `Account balance for ${this.owner}: $${this.#balance}`; } } const account = new BankAccount('John', 1000); account.deposit(500); console.log(account.getBalance()); // Output: Account balance for John: $1500 account.withdraw(200); console.log(account.getBalance()); // Output: Account balance for John: $1300 // Direct access to balance is not allowed console.log(account.#balance); // SyntaxError: Private field '#balance' must be declared in an enclosing class
In diesem Beispiel ist das #balance
-Feld privat und kann nur über öffentliche Methoden wie deposit
, withdraw
und getBalance
zugegriffen werden. Dies stellt sicher, dass der Kontostand auf kontrollierte Weise geändert wird und vor unbefugtem Zugriff oder Manipulation geschützt ist.
1. Was ist der Hauptgrund für die Verwendung privater Eigenschaften in einer Klasse?
2. Wie deklariert man eine private Eigenschaft?
3. Was passiert, wenn Sie versuchen, von außerhalb einer Klasse auf eine private Eigenschaft zuzugreifen?
Danke für Ihr Feedback!