Chapitre 10 : Programmation orientée objet

Écouter la leçon Lecture audio assistée par IA

1. Introduction à la POO

La Programmation Orientée Objet (POO) permet d'organiser le code en classes et objets.

2. Classes ES6

Déclaration d'une classe

class Personne {
    constructor(nom, age) {
        this.nom = nom;
        this.age = age;
    }

    sePresenter() {
        console.log(`Je suis ${this.nom}, ${this.age} ans`);
    }
}

// Créer une instance
let alice = new Personne("Alice", 25);
alice.sePresenter(); // "Je suis Alice, 25 ans"

3. Constructeur

Méthode spéciale appelée lors de la création d'un objet :

class Voiture {
    constructor(marque, modele, annee) {
        this.marque = marque;
        this.modele = modele;
        this.annee = annee;
        this.kilometrage = 0;
    }

    rouler(km) {
        this.kilometrage += km;
        console.log(`${this.marque} a roulé ${km} km`);
    }
}

let maVoiture = new Voiture("Toyota", "Corolla", 2020);
maVoiture.rouler(100);
console.log(maVoiture.kilometrage); // 100

4. Méthodes et propriétés

class CompteBancaire {
    constructor(titulaire, soldeInitial = 0) {
        this.titulaire = titulaire;
        this.solde = soldeInitial;
    }

    deposer(montant) {
        this.solde += montant;
        console.log(`Dépôt de ${montant}€. Nouveau solde: ${this.solde}€`);
    }

    retirer(montant) {
        if (montant > this.solde) {
            console.log("Solde insuffisant");
            return false;
        }
        this.solde -= montant;
        console.log(`Retrait de ${montant}€. Nouveau solde: ${this.solde}€`);
        return true;
    }

    afficherSolde() {
        console.log(`Solde de ${this.titulaire}: ${this.solde}€`);
    }
}

let compte = new CompteBancaire("Alice", 1000);
compte.deposer(500);  // Dépôt de 500€. Nouveau solde: 1500€
compte.retirer(200);  // Retrait de 200€. Nouveau solde: 1300€
compte.afficherSolde(); // Solde de Alice: 1300€

5. Héritage avec extends

class Animal {
    constructor(nom) {
        this.nom = nom;
    }

    parler() {
        console.log(`${this.nom} fait un bruit`);
    }
}

class Chien extends Animal {
    constructor(nom, race) {
        super(nom); // Appelle le constructeur parent
        this.race = race;
    }

    parler() {
        console.log(`${this.nom} aboie: Wouf!`);
    }

    courir() {
        console.log(`${this.nom} court`);
    }
}

let monChien = new Chien("Rex", "Labrador");
monChien.parler(); // "Rex aboie: Wouf!"
monChien.courir(); // "Rex court"

6. Getters et Setters

class Rectangle {
    constructor(largeur, hauteur) {
        this._largeur = largeur;
        this._hauteur = hauteur;
    }

    // Getter
    get aire() {
        return this._largeur * this._hauteur;
    }

    get perimetre() {
        return 2 * (this._largeur + this._hauteur);
    }

    // Setter
    set largeur(valeur) {
        if (valeur > 0) {
            this._largeur = valeur;
        } else {
            console.error("La largeur doit être positive");
        }
    }

    get largeur() {
        return this._largeur;
    }
}

let rect = new Rectangle(10, 5);
console.log(rect.aire);      // 50
console.log(rect.perimetre); // 30

rect.largeur = 15;
console.log(rect.aire);      // 75

7. Méthodes statiques

class MathUtils {
    static PI = 3.14159;

    static carre(x) {
        return x * x;
    }

    static cube(x) {
        return x * x * x;
    }
}

// Appel sans créer d'instance
console.log(MathUtils.PI);        // 3.14159
console.log(MathUtils.carre(5));  // 25
console.log(MathUtils.cube(3));   // 27

8. Exercice pratique

// Système de gestion de bibliothèque
class Livre {
    constructor(titre, auteur, annee) {
        this.titre = titre;
        this.auteur = auteur;
        this.annee = annee;
        this.emprunte = false;
    }

    emprunter() {
        if (this.emprunte) {
            console.log(`${this.titre} est déjà emprunté`);
            return false;
        }
        this.emprunte = true;
        console.log(`${this.titre} a été emprunté`);
        return true;
    }

    retourner() {
        this.emprunte = false;
        console.log(`${this.titre} a été retourné`);
    }
}

class Bibliotheque {
    constructor(nom) {
        this.nom = nom;
        this.livres = [];
    }

    ajouterLivre(livre) {
        this.livres.push(livre);
        console.log(`${livre.titre} ajouté à ${this.nom}`);
    }

    afficherLivres() {
        console.log(`\nLivres dans ${this.nom}:`);
        this.livres.forEach((livre, index) => {
            let statut = livre.emprunte ? "Emprunté" : "Disponible";
            console.log(`${index + 1}. ${livre.titre} - ${statut}`);
        });
    }
}

// Utilisation
let biblio = new Bibliotheque("Bibliothèque Municipale");

let livre1 = new Livre("1984", "George Orwell", 1949);
let livre2 = new Livre("Le Petit Prince", "Saint-Exupéry", 1943);

biblio.ajouterLivre(livre1);
biblio.ajouterLivre(livre2);

livre1.emprunter();
biblio.afficherLivres();

Conclusion

Vous maîtrisez maintenant la POO en JavaScript ! Dans le prochain chapitre, nous allons découvrir l'utilisation de modules.

Évaluation des acquis

Quiz du chapitre 10

Correction immédiate
Q1 Comment définit-on une classe en JavaScript (ES6) ?
Q2 Quel mot-clé est utilisé pour créer une instance d'une classe en JavaScript ?
Ateliers pratiques & Projets

Testez vos compétences avec nos exercices guidés et le tuteur IA.

Ateliers pratiques & Corrigés détaillés

Ateliers pratiques & Corrigés

#1 — Création de Classe
Atelier #1

Crée une classe 'Voiture' avec un constructeur prenant la marque et l'année.

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
class Voiture { constructor(marque, annee) { this.marque = marque; this.annee = annee; } }
#2 — Instanciation
Atelier #2

Crée une instance de 'Voiture' nommée 'maCaisse' pour une 'Tesla' de 2023.

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
const maCaisse = new Voiture("Tesla", 2023);
#3 — Méthode de classe
Atelier #3

Ajoute une méthode 'description' à la classe Voiture qui affiche les infos du véhicule.

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
class Voiture { constructor(m, a) { this.marque = m; this.annee = a; } description() { console.log(`C'est une ${this.marque} de ${this.annee}`); } }
#4 — Héritage
Atelier #4

Comment fait-on hériter une classe 'Bateau' d'une classe 'Vehicule' ?

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
class Bateau extends Vehicule { // ... }
#5 — Static
Atelier #5

À quoi sert le mot-clé 'static' sur une méthode ?

Correction instantanée et bienveillante
Diagnostic du tuteur IA Weegosoft :
Consulter la solution type du formateur
Solution de référence :
Il permet de définir une méthode liée à la classe elle-même et non aux instances créées.
Besoin d'aide ?
Tuteur Virtuel
Bonjour ! Je suis votre tuteur virtuel. Comment puis-je vous aider avec ce cours aujourd'hui ?
Historique des conversations
Chargement...