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

La programmation orientée objet : classes et instances

La programmation orientée objet : classes et instances. Dans cette leçon du cours JavaScript, vous apprendrez à : expliquer ce qu'est la programmation orientée objet (POO) et pourquoi on l'utilise ; d...

0 chapitres 0 QCM Accès gratuit
Dans cet article

À propos de ce cours

La programmation orientée objet : classes et instances. Dans cette leçon du cours JavaScript, vous apprendrez à : expliquer ce qu'est la programmation orientée objet (POO) et pourquoi on l'utilise ; distinguer une classe d'une instance ; écrire une classe avec un constructeur, des propriétés et des méthodes ; créer des instances avec new et vérifier leur type avec instanceof.

Chapitre 16 — La programmation orientée objet · 16.1 La programmation orientée objet : classes et instances

🎯 Objectifs de la leçon
• expliquer ce qu'est la programmation orientée objet (POO) et pourquoi on l'utilise ;
• distinguer une classe d'une instance ;
• écrire une classe avec un constructeur, des propriétés et des méthodes ;
• créer des instances avec new et vérifier leur type avec instanceof.

1. Pourquoi la programmation orientée objet ?

Un programme manipule des « choses » : des comptes bancaires, des produits, des élèves, des formes… Chacune a des données (un solde, un prix, un nom) et des comportements (déposer, calculer un prix TTC, afficher). La POO consiste à regrouper ces données et ces comportements dans un même objet.

Sans classe, il faut recopier la même structure pour chaque objet :

// Sans classe : on recopie la même structure pour chaque compte
const compte1 = {
  titulaire: "Amina",
  solde: 100,
  deposer(montant) { this.solde += montant; },
};
const compte2 = {
  titulaire: "Sami",
  solde: 50,
  deposer(montant) { this.solde += montant; }, // copie de la même méthode
};
compte1.deposer(20);
console.log(compte1.titulaire, compte1.solde);
console.log("Même fonction deposer ?", compte1.deposer === compte2.deposer);

Résultat dans la console

Amina 120
Même fonction deposer ? false

Chaque objet transporte sa propre copie de deposer. Pour 1 000 comptes, il y aurait 1 000 copies, et une correction devrait être faite partout.

2. Classe et instance

  • Une classe est un moule (un plan) : elle décrit quelles données et quelles méthodes auront les objets.
  • Une instance est un objet fabriqué à partir de ce moule avec new. Chaque instance a ses propres données.

Une classe CompteBancaire et deux instances
Figure 1 — Une classe, plusieurs instances.

3. Écrire une classe

// La classe est le MOULE ; chaque objet créé avec new est une INSTANCE
class CompteBancaire {
  // Le constructeur initialise les propriétés de chaque instance
  constructor(titulaire, solde = 0) {
    this.titulaire = titulaire;
    this.solde = solde;
  }

  // Les méthodes décrivent ce que l'objet sait faire
  deposer(montant) {
    this.solde += montant;
  }

  retirer(montant) {
    if (montant > this.solde) {
      console.log(`Refusé : solde insuffisant pour ${this.titulaire}`);
      return false;
    }
    this.solde -= montant;
    return true;
  }

  afficher() {
    return `${this.titulaire} : ${this.solde} DT`;
  }
}

const compteAmina = new CompteBancaire("Amina", 100);
const compteSami = new CompteBancaire("Sami");

compteAmina.deposer(50);
compteSami.retirer(30);

console.log(compteAmina.afficher());
console.log(compteSami.afficher());
console.log("Type de la classe :", typeof CompteBancaire);
console.log("compteAmina est un CompteBancaire ?", compteAmina instanceof CompteBancaire);
console.log("Même méthode partagée ?", compteAmina.deposer === compteSami.deposer);

Résultat dans la console

Refusé : solde insuffisant pour Sami
Amina : 150 DT
Sami : 0 DT
Type de la classe : function
compteAmina est un CompteBancaire ? true
Même méthode partagée ? true
  • class NomDeClasse { … }: par convention, le nom commence par une majuscule (PascalCase).
  • constructor(…) est appelé automatiquement par new. Il initialise les propriétés avec this.propriete = valeur.
  • Les méthodes s'écrivent sans le mot function et utilisent this pour accéder à l'objet courant.
  • instanceof vérifie qu'un objet a été créé à partir d'une classe.
  • Toutes les instances partagent la même méthode deposer (nous verrons pourquoi en leçon 16.6).

4. Ne pas oublier new

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}
try {
  const p = Point(1, 2); // oubli de new
} catch (e) {
  console.log(e.constructor.name + " :", e.message);
}
const p = new Point(1, 2);
console.log(p);

Résultat dans la console

TypeError : Class constructor Point cannot be invoked without 'new'
Point { x: 1, y: 2 }
ℹ️ À retenir
• Classe = moule ; instance = objet créé avec new Classe(…).
• Le constructor initialise les données de chaque instance avec this.
• Les méthodes décrivent les comportements et sont partagées par toutes les instances.
• Un nom de classe commence par une majuscule ; une classe s'utilise toujours avec new.

🛠 Activité 1 — Ma première classe

Mission : Écrivez une classe Etudiant pour gérer les notes d'un étudiant.

Questions pour avancer (répondez dans votre compte rendu, puis appliquez dans votre projet) :

  1. Quelles données doit contenir un étudiant (au moins trois) ? Lesquelles sont passées au constructeur, lesquelles ont une valeur de départ (par exemple une liste de notes vide) ?
  2. Écrivez les méthodes ajouterNote(note), moyenne() et presenter(). Que doit renvoyer moyenne() s'il n'y a aucune note ?
  3. Créez trois étudiants et ajoutez-leur des notes. Modifier les notes de l'un change-t-il celles des autres ? Pourquoi ?
  4. Affichez typeof Etudiant et typeof new Etudiant(…). Que concluez-vous ?
  5. Écrivez une fonction (hors classe) meilleur(etudiants) qui reçoit un tableau d'étudiants et renvoie celui qui a la meilleure moyenne.
  6. Quelle est la différence entre e1.moyenne et e1.moyenne()? Testez les deux.

Je vérifie / je rends :

  • ☐ Le fichier etudiant.js avec vos tests.
  • ☐ Les réponses aux questions 3, 4 et 6.

16.2 Le mot-clé this en JavaScript →