Avez-vous une question? (216) 97 656 803 hajjriadh@gmail.com
JavaScript

Getters, setters et membres statiques

Getters, setters et membres statiques. Dans cette leçon du cours JavaScript, vous apprendrez à : créer des propriétés calculées avec get ; valider une valeur avant de l'enregistrer avec set ; déclarer...

0 chapitres 0 QCM Accès gratuit
Dans cet article

À propos de ce cours

Getters, setters et membres statiques. Dans cette leçon du cours JavaScript, vous apprendrez à : 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 ».

Chapitre 16 — La programmation orientée objet · 16.3 Getters, setters et membres statiques

🎯 Objectifs de la leçon
• 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.fahrenheit n'est stocké nulle part : il est recalculé à chaque lecture, donc toujours à jour.
  • t.celsius = -300 passe 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 = … dans set celsius s'appellerait lui-même à l'infini). En leçon 16.4, nous remplacerons _celsius par 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

Membres statiques de la classe et propriétés d'une instance
Figure 1 — Statique : une copie pour la classe. Instance : une copie par objet.

ℹ️ À retenir
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()…
ℹ️ À retenir
• 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) :

  1. Ajoutez les getters aire, perimetre et estCarre. 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.
  2. Ajoutez des setters largeur et hauteur qui refusent les valeurs négatives ou non numériques avec une RangeError. Le constructeur doit-il passer par ces setters ? Pourquoi ?
  3. Essayez d'écrire r.aire = 50. Que se passe-t-il ? Et dans un fichier .mjs?
  4. Ajoutez un compteur statique Rectangle.nombre qui compte les rectangles créés. Que vaut r.nombre? Pourquoi ?
  5. Écrivez les fabriques statiques Rectangle.carre(cote) et Rectangle.depuisTexte("3x4"). Que doit faire depuisTexte si le texte est mal formé ?
  6. Math.max, Date.now, Array.isArray: sont-elles statiques ? Comment le reconnaissez-vous ?

Je vérifie / je rends :

  • ☐ La classe Rectangle et 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 (#) →