À propos de ce cours
Chapitre 16 — La programmation orientée objet · 16.3 Getters, setters et membres statiques
• créer des propriétés calculées avec
get; • valider une valeur avant de l'enregistrer avec
set; • déclarer des propriétés et des méthodes statiques ;
• écrire une méthode statique « fabrique ».
1. Getters et setters
Un getter (get) est une méthode qui se lit comme une propriété, sans parenthèses. Il sert aux valeurs
calculées à partir d'autres données. Un setter (set) est une méthode appelée quand on affecte
une valeur : il peut la vérifier ou la transformer.
class Temperature {
constructor(celsius) {
this.celsius = celsius; // passe par le setter ci-dessous
}
// Getter : se lit comme une propriété, mais exécute du code
get fahrenheit() {
return this._celsius * 9 / 5 + 32;
}
// Setter : s'écrit comme une propriété, et peut valider la valeur
set fahrenheit(f) {
this.celsius = (f - 32) * 5 / 9;
}
get celsius() {
return this._celsius;
}
set celsius(valeur) {
if (valeur < -273.15) {
throw new RangeError("En dessous du zéro absolu !");
}
this._celsius = Math.round(valeur * 10) / 10;
}
}
const t = new Temperature(25);
console.log(t.celsius, "°C =", t.fahrenheit, "°F"); // pas de parenthèses
t.fahrenheit = 212;
console.log("Après t.fahrenheit = 212 :", t.celsius, "°C");
try {
t.celsius = -300;
} catch (e) {
console.log(e.name + " :", e.message);
}
Résultat dans la console
25 °C = 77 °F Après t.fahrenheit = 212 : 100 °C RangeError : En dessous du zéro absolu !
t.fahrenheitn'est stocké nulle part : il est recalculé à chaque lecture, donc toujours à jour.t.celsius = -300passe par le setter, qui refuse la valeur.- La vraie donnée est rangée dans
_celsius. Le getter et le setter ne peuvent pas utiliser le même nom que la propriété (this.celsius = …dansset celsiuss'appellerait lui-même à l'infini). En leçon 16.4, nous remplacerons_celsiuspar un vrai champ privé#celsius. - Un getter sans setter crée une propriété en lecture seule.
2. Les membres statiques
Un membre static appartient à la classe elle-même, pas aux instances. On l'utilise avec le nom de la classe :
Produit.TVA. Il sert aux constantes, aux compteurs partagés, aux fonctions utilitaires et aux « fabriques ».
class Produit {
// Membres STATIQUES : appartiennent à la classe, pas aux instances
static TVA = 0.19;
static nombreCrees = 0;
constructor(nom, prixHT) {
this.nom = nom;
this.prixHT = prixHT;
Produit.nombreCrees++;
}
get prixTTC() {
return Math.round(this.prixHT * (1 + Produit.TVA) * 100) / 100;
}
// Méthode statique « fabrique » : crée une instance à partir d'autre chose
static depuisTexte(texte) {
const [nom, prix] = texte.split(";");
return new Produit(nom, Number(prix));
}
}
const clavier = new Produit("Clavier", 50);
const souris = Produit.depuisTexte("Souris;20");
console.log(clavier.prixTTC, souris.prixTTC);
console.log("Produits créés :", Produit.nombreCrees);
console.log("Via la classe :", Produit.TVA, "| via une instance :", clavier.TVA);
console.log("souris est un Produit ?", souris instanceof Produit);
Résultat dans la console
59.5 23.8 Produits créés : 2 Via la classe : 0.19 | via une instance : undefined souris est un Produit ? true

Figure 1 — Statique : une copie pour la classe. Instance : une copie par objet.
Produit.depuisTexte(…) est une méthode fabrique: elle crée une instance à partir d'un autre format (texte, JSON, formulaire).
JavaScript en contient beaucoup : Array.from(), Date.now(), Number.parseFloat(), Object.keys()…•
get x(): se lit obj.x, calcule une valeur ; sans setter, la propriété est en lecture seule.•
set x(v): appelé par obj.x = v, il valide ou transforme la valeur.•
static: appartient à la classe, s'utilise avec Classe.membre, et n'est pas visible sur les instances.• Méthode fabrique statique :
Classe.depuisXxx(…) renvoie une nouvelle instance.🛠 Activité 3 — Une classe Rectangle bien protégée
Mission : Écrivez une classe Rectangle avec largeur et hauteur.
Questions pour avancer (répondez dans votre compte rendu, puis appliquez dans votre projet) :
- Ajoutez les getters
aire,perimetreetestCarre. Pourquoi est-il préférable d'en faire des getters plutôt que des propriétés calculées une fois dans le constructeur ? Testez en modifiant la largeur après la création. - Ajoutez des setters
largeurethauteurqui refusent les valeurs négatives ou non numériques avec uneRangeError. Le constructeur doit-il passer par ces setters ? Pourquoi ? - Essayez d'écrire
r.aire = 50. Que se passe-t-il ? Et dans un fichier.mjs? - Ajoutez un compteur statique
Rectangle.nombrequi compte les rectangles créés. Que vautr.nombre? Pourquoi ? - Écrivez les fabriques statiques
Rectangle.carre(cote)etRectangle.depuisTexte("3x4"). Que doit fairedepuisTextesi le texte est mal formé ? Math.max,Date.now,Array.isArray: sont-elles statiques ? Comment le reconnaissez-vous ?
Je vérifie / je rends :
- ☐ La classe
Rectangleet un fichier de tests qui couvre les cas valides et les erreurs.
← 16.2 Le mot-clé this en JavaScript16.4 L'encapsulation : les champs et méthodes privés (#) →