Contenu du cours
Maîtrise Avancée de JavaScript
Maîtrise Avancée de JavaScript
Propriétés Privées
Dans la programmation orientée classe, il y a souvent des cas où vous souhaitez limiter l'accès direct à certaines propriétés pour protéger l'intégrité des données et contrôler comment elles sont modifiées.
Qu'est-ce que les Propriétés Privées ?
En JavaScript, les propriétés de classe sont généralement publiques, ce qui signifie qu'elles peuvent être accédées et modifiées depuis l'extérieur de la classe. Cependant, il existe des situations où vous devez restreindre l'accès à certaines propriétés, en vous assurant qu'elles ne peuvent être accédées ou modifiées qu'au sein de la classe elle-même. Celles-ci sont appelées propriétés privées.
Les propriétés privées aident à créer une frontière claire entre le fonctionnement interne de la classe et le code externe. Elles sont utiles lorsque vous souhaitez masquer des données sensibles ou empêcher des modifications involontaires d'une propriété depuis l'extérieur de la classe.
Pensez-y comme le moteur d'une voiture. Bien que vous puissiez conduire la voiture et interagir avec ses commandes, vous n'avez pas accès direct à ses composants moteur pendant la conduite. Le moteur est protégé contre toute altération externe, et seuls les mécaniciens autorisés (méthodes de classe) peuvent effectuer des ajustements.
Comment Déclarer et Utiliser des Champs Privés dans une Classe
En JavaScript, les propriétés privées sont déclarées en utilisant la syntaxe #
(introduite dans ES2020). En préfixant un nom de propriété avec #
, vous la rendez privée, ce qui signifie qu'elle ne peut être accédée qu'au sein de la classe elle-même.
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
Dans cet exemple, #type
est un champ privé. Il ne peut pas être accédé ou modifié en dehors de la classe Animal
. Toute tentative d'accès direct à #type
depuis une instance (comme lion.#type
) entraînera une erreur de syntaxe. Cela garantit que les données sensibles ou critiques ne sont modifiées que par des méthodes contrôlées définies dans la classe.
Avantages des Propriétés Privées
- Les propriétés privées protègent les données sensibles en empêchant l'accès externe. Elles garantissent que les données ne peuvent être modifiées que par des méthodes spécifiques, réduisant ainsi le risque de modifications accidentelles ou non autorisées;
- Les propriétés privées vous permettent d'encapsuler les détails de l'implémentation, cachant la logique interne à l'utilisateur. Cela favorise une séparation claire des préoccupations et maintient votre code modulaire;
- Avec les propriétés privées, vous avez un contrôle plus précis sur la façon dont les données sont accédées et modifiées au sein d'une classe, garantissant que les modifications se produisent par le biais de méthodes bien définies.
Exemple du Monde Réel : Compte Bancaire
Prenons une analogie du monde réel pour gérer un solde de compte bancaire. Dans une banque, le solde de votre compte est protégé, et personne ne peut y accéder ou le modifier directement. Vous ne pouvez interagir avec lui que par des processus autorisés comme les dépôts et les retraits. De même, nous pouvons utiliser des propriétés privées dans une classe pour protéger le champ de solde contre tout accès ou modification directe.
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
Dans cet exemple, le champ #balance
est privé et ne peut être accédé que par des méthodes publiques comme deposit
, withdraw
, et getBalance
. Cela garantit que le solde est modifié de manière contrôlée, le protégeant contre tout accès ou manipulation non autorisé.
1. Quelle est la principale raison d'utiliser des propriétés privées dans une classe ?
2. Comment déclarez-vous une propriété privée ?
3. Que se passera-t-il si vous essayez d'accéder à une propriété privée depuis l'extérieur d'une classe ?
Merci pour vos commentaires !