Getters et Setters en JavaScript (Get et Set)
Introduction aux Getters et Setters
En JavaScript, les getters et setters sont des méthodes spéciales qui permettent d’accéder et de manipuler les propriétés d’un objet de manière contrôlée.
Ces méthodes sont particulièrement utiles pour encapsuler la logique d’accès aux données, offrant ainsi un moyen propre et sécurisé de gérer les propriétés des objets.
Qu’est-ce qu’un Getter ?
Un getter est une méthode utilisée pour obtenir la valeur d’une propriété. Il agit comme un intermédiaire, permettant d’ajouter une logique supplémentaire lors de la lecture d’une propriété.
L’utilisation des getters peut simplifier le code et améliorer la lisibilité.
class Person {
constructor(name) {
this._name = name;
}
get name() {
return this._name.toUpperCase();
}
}
const person = new Person('Carmen');
console.log(person.name); // CARMEN
Dans cet exemple, le getter name
renvoie la valeur de _name
en majuscules. Cela permet de centraliser la transformation et d’assurer une sortie cohérente.
Qu’est-ce qu’un Setter ?
Un setter est une méthode utilisée pour définir la valeur d’une propriété. Il permet d’enfermer la logique de validation ou de transformation des données avant de les attribuer à une propriété.
Les setters sont essentiels pour contrôler la manière dont les propriétés d’un objet sont modifiées.
class Person {
constructor(name) {
this._name = name;
}
get name() {
return this._name.toUpperCase();
}
set name(newName) {
if (newName.length > 0) {
this._name = newName;
} else {
console.log('Invalid name');
}
}
}
const person = new Person('arnold');
person.name = 'willy';
console.log(person.name); // WILLY
person.name = ''; // Invalid name
name
vérifie si le nouveau nom est valide avant de l’assigner à la propriété _name
. Cela garantit que la propriété ne contient que des valeurs valides.Quand Utiliser les Getters en JavaScript ?
Les getters en JavaScript ne sont pas uniquement des outils pratiques pour accéder aux propriétés d’un objet, ils offrent également une flexibilité et un contrôle supplémentaires qui peuvent grandement améliorer la qualité de votre code.
Voici quelques situations dans lesquelles l’utilisation de getters est particulièrement utile :
1. Lecture de Propriétés Calculées
Lorsque la valeur d’une propriété dépend d’autres propriétés ou nécessite un calcul, un getter est idéal.
Cela vous permet de calculer la valeur à la volée, sans avoir à stocker la donnée de manière redondante.
class Rectangle {
constructor(width, height) {
this.width = width;
this.height = height;
}
get area() {
return this.width * this.height;
}
}
const rect = new Rectangle(10, 5);
console.log(rect.area); // 50
Dans cet exemple, la propriété area
est calculée dynamiquement en fonction de width
et height
. Il n’est donc pas nécessaire de stocker cette valeur séparément, ce qui évite les incohérences dans le code.
2. Contrôle d’Accès aux Propriétés
Les getters peuvent être utilisés pour contrôler l’accès aux propriétés sensibles ou pour masquer la complexité interne d’un objet.
En utilisant un getter, vous pouvez restreindre la manière dont une propriété est exposée à l’extérieur de l’objet.
class BankAccount {
constructor(balance) {
this._balance = balance;
}
get balance() {
return this._balance.toFixed(2);
}
}
const account = new BankAccount(1500.5);
console.log(account.balance); // 1500.50
Ici, le getter balance
formate la valeur pour garantir qu’elle est toujours affichée avec deux décimales, ce qui permet d’offrir une interface utilisateur cohérente.
3. Encapsulation de la Logique
Utiliser un getter est une bonne pratique pour encapsuler la logique d’accès à une propriété, surtout si cette logique peut évoluer avec le temps.
Cela permet d’isoler le changement et de minimiser les impacts sur le reste du code.
class User {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
}
const user = new User('John', 'Doe');
console.log(user.fullName); // John Doe
Dans cet exemple, fullName
combine firstName
et lastName
, offrant une interface propre et intuitive pour accéder au nom complet de l’utilisateur. Si la structure du nom change à l’avenir, il suffira de modifier le getter sans impacter le reste du code.
4. Validation et Nettoyage des Données
Même si les setters sont généralement utilisés pour la validation, les getters peuvent également jouer un rôle dans la validation ou le nettoyage des données lorsqu’elles sont lues.
class User {
constructor(email) {
this._email = email;
}
get email() {
return this._email.trim().toLowerCase();
}
}
const user = new User(' Example@DOMAIN.COM ');
console.log(user.email); // example@domain.com
Dans cet exemple, le getter email
s’assure que l’adresse email est toujours en minuscule et sans espaces inutiles avant d’être renvoyée, ce qui garantit une utilisation cohérente et propre de la donnée.
Les cas d’utilisation de getter sont divers et variés
Les getters sont essentiels lorsque vous souhaitez offrir un accès contrôlé, sécurisé et propre aux propriétés d’un objet.
Ils permettent de masquer les détails d’implémentation, d’effectuer des calculs dynamiques, et d’assurer que les données sont présentées de manière cohérente et formatée. En comprenant quand et comment les utiliser, vous pouvez concevoir des objets JavaScript plus robustes et maintenables.
Maintenant Voyons Quels sont les Cas d’utilisation des Setters en JavaScript ?
Les setters en JavaScript enferme la logique de modification des propriétés d’un objet.
Ils permettent non seulement de contrôler l’affectation des valeurs, mais aussi d’ajouter des vérifications ou transformations avant que ces valeurs ne soient enregistrées. Voici quelques situations où les setters sont particulièrement utiles :
1. Validation des Données
L’un des cas les plus courants pour utiliser un setter est de valider les données avant qu’elles ne soient attribuées à une propriété. Cela permet de garantir que seules des valeurs valides sont enregistrées dans l’objet.
class User {
constructor(age) {
this._age = age;
}
set age(value) {
if (value > 0 && Number.isInteger(value)) {
this._age = value;
} else {
console.log('Invalid age');
}
}
}
const user = new User(25);
user.age = -5; // Invalid age
console.log(user._age); // 25
Dans cet exemple, le setter age
vérifie que l’âge est un nombre entier positif avant de l’affecter. Si la validation échoue, l’âge n’est pas modifié, ce qui protège l’intégrité des données.
2. Encapsulation de la Logique de Modification
Les setters permettent de centraliser la logique de modification des propriétés. Au lieu de disperser des vérifications ou des transformations dans tout le code, vous pouvez les encapsuler dans un setter. Cela rend le code plus propre et plus facile à maintenir.
class Employee {
constructor(name, salary) {
this._name = name;
this._salary = salary;
}
set salary(value) {
if (value >= 30000) {
this._salary = value;
} else {
console.log('Salary too low');
}
}
}
const employee = new Employee('Jane', 50000);
employee.salary = 25000; // Salary too low
console.log(employee._salary); // 50000
Le setter salary
garantit que le salaire ne peut pas être inférieur à un certain seuil, ce qui centralise la règle de gestion dans une seule méthode.
3. Transformation Automatique des Données
Les setters peuvent être utilisés pour transformer automatiquement les données avant qu’elles ne soient stockées dans une propriété.
Cela peut inclure des opérations comme la conversion de types, la mise en forme ou d’autres ajustements nécessaires.
class Product {
constructor(name, price) {
this._name = name;
this._price = price;
}
set price(value) {
this._price = parseFloat(value).toFixed(2);
}
}
const product = new Product('Laptop', '1000');
product.price = '1234.5';
console.log(product._price); // 1234.50
price
convertit le prix en un nombre avec deux décimales, assurant que la valeur est toujours stockée dans un format standard.4. Déclenchement d’Actions Additionnelles
Parfois, vous souhaitez que la modification d’une propriété déclenche d’autres actions, comme la mise à jour d’une interface utilisateur ou l’enregistrement de données dans une base.
Les setters offrent une façon propre de lier ces actions à des changements de propriété.
class Thermostat {
constructor(temperature) {
this._temperature = temperature;
}
set temperature(value) {
this._temperature = value;
this.updateDisplay();
}
updateDisplay() {
console.log(`Current temperature: ${this._temperature}°C`);
}
}
const thermostat = new Thermostat(22);
thermostat.temperature = 25; // Current temperature: 25°C
Dans cet exemple, à chaque fois que la température est modifiée via le setter temperature
, l’affichage est automatiquement mis à jour en appelant la méthode updateDisplay
.
5. Protection Contre les Modifications Directes
Enfin, les setters peuvent être utilisés pour protéger certaines propriétés contre les modifications directes, en appliquant des règles strictes ou en rendant certaines propriétés en lecture seule, sauf dans des conditions spécifiques.
class Account {
constructor(balance) {
this._balance = balance;
}
set balance(value) {
console.log('Balance modification is not allowed directly.');
}
}
const account = new Account(1000);
account.balance = 500; // Balance modification is not allowed directly.
console.log(account._balance); // 1000
Dans ce cas, le setter balance
empêche toute modification directe de la propriété _balance
, ce qui protège les données contre des changements non autorisés.
Les setters est leur utilisation sont diverses et variées et bien plus encore…
Les setters en JavaScript contrôle donc la façon dont les propriétés des objets sont modifiées à l’intérieur d’eux mêmes.
Ils permettent d’ajouter de la validation, de la transformation, et même de déclencher des actions lorsque des propriétés changent.
En les utilisant correctement, vous pouvez améliorer la sécurité, la fiabilité et la maintenabilité de votre code.
Pourquoi Implémenter les Getters et Setters à l’Intérieur d’une Classe ?
Lorsqu’il s’agit de manipuler les propriétés d’un objet en JavaScript, il est souvent préférable d’implémenter les méthodes getter et setter directement à l’intérieur de la classe plutôt que d’utiliser des fonctions externes ou d’autres méthodes en dehors de la classe. Voici pourquoi :
1. Encapsulation et Cohésion
L’un des principaux objectifs de la programmation orientée objet (POO) est l’encapsulation, qui consiste à regrouper les données (propriétés) et les comportements (méthodes) qui les manipulent dans une même entité, la classe.
En définissant les getters et setters à l’intérieur de la classe, vous maintenez la cohésion de l’objet. Cela signifie que toutes les fonctionnalités liées à un objet spécifique sont regroupées, ce qui facilite la gestion et la maintenance du code.
class Car {
constructor(brand, speed) {
this._brand = brand;
this._speed = speed;
}
get brand() {
return this._brand;
}
set speed(value) {
if (value > 0) {
this._speed = value;
}
}
}
En encapsulant les getters et setters dans la classe Car
, vous maintenez toutes les fonctionnalités relatives à une voiture dans une seule unité cohérente.
2. Protection des Données
Les getters et setters à l’intérieur de la classe permettent de contrôler directement l’accès et la modification des propriétés privées ou protégées de l’objet.
Cela protège les données contre des accès non autorisés ou des modifications inattendues, ce qui n’est pas possible avec des fonctions externes.
class BankAccount {
constructor(balance) {
this._balance = balance;
}
get balance() {
return this._balance;
}
set balance(value) {
if (value >= 0) {
this._balance = value;
}
}
}
Ici, la propriété _balance
est protégée, et seul le setter balance
peut modifier sa valeur de manière contrôlée, empêchant les modifications accidentelles ou malveillantes.
3. Simplicité et Lisibilité du Code
En implémentant les getters et setters à l’intérieur de la classe, vous simplifiez le code en évitant la dispersion des responsabilités.
Toutes les manipulations des propriétés se font à l’intérieur de la classe, ce qui rend le code plus lisible et plus facile à comprendre pour d’autres développeurs ou pour vous-même lors de futures révisions.
class Rectangle {
constructor(width, height) {
this._width = width;
this._height = height;
}
get area() {
return this._width * this._height;
}
set width(value) {
this._width = value;
}
}
Dans cet exemple, toute la logique concernant les dimensions et l’aire du rectangle est contenue dans la classe Rectangle
, rendant le code plus intuitif et plus facile à suivre.
4. Facilité de Maintenance
En regroupant les getters et setters avec la définition de la classe, vous facilitez la maintenance de votre code.
Si la logique d’accès ou de modification d’une propriété doit être modifiée, vous savez exactement où chercher : dans la classe elle-même.
Cette centralisation réduit les risques d’introduire des bugs lors de mises à jour.
5. Conformité aux Principes de la POO
L’utilisation de getters et setters à l’intérieur de la classe est conforme aux principes de la programmation orientée objet, notamment le principe d’encapsulation et celui du moindre étonnement (principle of least astonishment).
Cela permet de créer des objets qui gèrent leurs propres états, conformément aux meilleures pratiques de la POO.
6. Interopérabilité avec les Outils et Frameworks
De nombreux outils et frameworks JavaScript s’attendent à ce que les méthodes de manipulation des propriétés soient définies à l’intérieur de la classe.
Par exemple, les frameworks de gestion d’état ou de liaison de données (comme Vue.js) peuvent utiliser les getters et setters pour détecter les changements de propriété et mettre à jour automatiquement l’interface utilisateur.
Définir ces méthodes à l’intérieur de la classe garantit une meilleure compatibilité.
Les Getters et les Setters dans les Classes Meilleure Option ?
Faut il utiliser Les Getters et les Setters seulement avec les Classes ?
Et bien Non, en JavaScript, les getters et setters ne sont pas limités aux classes.
Vous pouvez également les utiliser avec des objets littéraux.
Les getters et setters sont des propriétés spéciales qui vous permettent de définir des méthodes pour accéder (getter) et modifier (setter) des propriétés d’un objet, sans utiliser explicitement de classes.
Comment Utiliser des Getters et Setters avec des Objets ?
Voici comment vous pouvez définir des getters et setters dans un objet littéral :
Exemple de Getter et Setter dans un Objet Littéral
const person = {
firstName: 'John',
lastName: 'Doe',
// Définition d'un getter pour la propriété 'fullName'
get fullName() {
return `${this.firstName} ${this.lastName}`;
},
// Définition d'un setter pour la propriété 'fullName'
set fullName(name) {
const [first, last] = name.split(' ');
this.firstName = first;
this.lastName = last;
}
};
// Utilisation du getter
console.log(person.fullName); // John Doe
// Utilisation du setter
person.fullName = 'Jane Smith';
console.log(person.firstName); // Jane
console.log(person.lastName); // Smith
Dans cet exemple :
- Getter (
get fullName
) : Cette méthode est appelée lorsque vous essayez d’accéder àperson.fullName
. Elle combinefirstName
etlastName
pour retourner le nom complet. - Setter (
set fullName
) : Cette méthode est appelée lorsque vous essayez de définirperson.fullName
. Elle prend la chaîne de texte, la sépare en prénom et nom de famille, et les affecte àfirstName
etlastName
.
Avantages d’Utiliser les Getters et Setters avec des Objets
- Flexibilité : Vous pouvez facilement ajouter une logique d’accès ou de modification à vos propriétés sans devoir réécrire du code ou changer la structure de votre objet.
- Simplification : Ils permettent de masquer la complexité derrière des propriétés simples, offrant une interface propre et intuitive.
- Encapsulation : Comme avec les classes, les getters et setters permettent de contrôler et de valider les données avant qu’elles ne soient modifiées ou lues, même dans des objets littéraux.
Maintenant Peut on utiliser des Getters et Setters avec une Fonction Constructeur aussi ?
La réponse est Oui, vous pouvez également utiliser des getters et setters avec des fonctions constructeurs en JavaScript.
Les fonctions constructeurs étaient la méthode principale pour créer des objets et des « classes » avant l’introduction de la syntaxe class
en ES6.
Avec les fonctions constructeurs, vous pouvez toujours définir des getters et setters pour les propriétés de vos objets.
Utilisation des Getters et Setters avec une Fonction Constructeur
Exemple de Getter et Setter avec une Fonction Constructeur
Voici comment vous pourriez utiliser des getters et setters avec une fonction constructeur :
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
Object.defineProperty(this, 'fullName', {
get() {
return `${this.firstName} ${this.lastName}`;
},
set(name) {
const [first, last] = name.split(' ');
this.firstName = first;
this.lastName = last;
}
});
}
const person = new Person('John', 'Doe');
console.log(person.fullName); // John Doe
person.fullName = 'Jane Smith';
console.log(person.firstName); // Jane
console.log(person.lastName); // Smith
Explication de l’Exemple
Fonction Constructeur
Person
: Nous définissons une fonction constructeur qui initialise les propriétésfirstName
etlastName
.Object.defineProperty
: Pour ajouter un getter et un setter à l’objet créé par le constructeur, nous utilisonsObject.defineProperty
. Cette méthode nous permet de définir des propriétés sur l’objet avec des options spécifiques, commeget
etset
.Getter (
get fullName
) : La fonctionget
est appelée lorsqu’on accède à la propriétéfullName
. Elle combinefirstName
etlastName
pour retourner le nom complet.Setter (
set fullName
) : La fonctionset
est appelée lorsqu’on modifie la propriétéfullName
. Elle prend une chaîne de texte, la sépare en prénom et nom de famille, puis met à jour les propriétésfirstName
etlastName
.
Avantages d’Utiliser les Getters et Setters avec des Fonctions Constructeurs
Encapsulation : Comme avec les classes et les objets littéraux, vous pouvez encapsuler la logique d’accès et de modification des propriétés.
Compatibilité : Cette approche fonctionne avec les versions plus anciennes de JavaScript qui ne prennent pas en charge la syntaxe
class
.Contrôle Accru :
Object.defineProperty
vous donne un contrôle précis sur les propriétés, vous permettant de les rendre non énumérables ou non configurables, par exemple.
class
n’est pas supportée ou si vous préférez le style plus ancien de JavaScript.Ce qu’il faut retenir :
Pour les développeurs avides de perfectionner leurs compétences en JavaScript, j’offre un bonus exclusif. Télécharge notre Guide gratuit « Avec plein de Secrets et d’astuces en JavaScript » pour découvrir des techniques et astuces supplémentaires qui amélioreront ton code et ton expertise.
Le Guide Bonus Exclusif
En allant plus loin, avec ce Guide Bonus Exclusif rien que pour Toi !
Voici un guide complet sur le JavaScript, où tu verras des techniques pour performer en programmation Js.
Ce guide te permettra de perfectionner tes compétences et de devenir un expert JavaScript. Ne le rate pas et développe ton expertise !
En adoptant ce qu’il contient, tu rends ton apprentissage de JavaScript plus performant avec une plus grande facilité tous les jours . Voici de quoi enrichir tout de suite ton savoir-faire ? Le guide complet t’attend !
Quelques liens en supplément de ce cours :
https://developpeur-pro.com/cours-javascript-les-bases
Rejoignez notre Newsletter et Restez Informé !
Vous souhaitez rester à jour avec les dernières tendances et actualités du monde du développement et le métier de développeur. Comment devenir développeur pro ? Rejoignez notre newsletter pour obtenir un accès exclusif à du contenu premium, des astuces de codage, des mises à jour sur les nouvelles fonctionnalités et bien plus encore !
Avantages de l’Inscription
- Restez Informé: Recevez des articles informatifs sur les dernières avancées et les meilleures pratiques de codage et les softkills.
- Promos Exclusives: Accédez à des formations détaillés et à des exemples de code pour améliorer vos compétences en programmation.
- Aperçus des Nouveautés: Soyez parmi les premiers à découvrir les nouvelles fonctionnalités et les frameworks émergents dans l’écosystème du développement FrontEnd et Backend.
- Communauté Engagée: Rejoignez une communauté passionnée de développeurs et partagez vos idées, questions et expériences.
Comment S’Inscrire
C’est simple et rapide ! Remplissez le formulaire d’inscription avec votre adresse e-mail et cliquez sur « S’Inscrire ». Vous recevrez régulièrement notre newsletter dans votre boîte de réception.
L’inscription à notre newsletter est un moyen idéal de rester informé et de progresser dans le domaine de la programmation et du développement pour devenir un développeur professionnel ou une développeuse pro.