Chapitre 10 – Programmation orientée objet (POO) en JavaScript
1. Qu'est-ce que la programmation orientée objet ?
La programmation orientée objet (ou POO) est un paradigme de programmation qui permet de modéliser des objets du monde réel avec leurs caractéristiques (propriétés) et leurs comportements (méthodes).
JavaScript est un langage orienté objet, mais il est particulier : il repose historiquement sur un système de prototypes. Depuis ECMAScript 6 (ES6), JavaScript propose aussi une syntaxe plus claire avec le mot-clé class.
2. Définir une classe et créer des instances
Voici comment on définit une classe avec ES6 :
class Animal {
constructor(nom) {
this.nom = nom;
}
parler() {
console.log(`${this.nom} fait un bruit.`);
}
}
const chien = new Animal("Rex");
chien.parler();
classpermet de définir un modèle d'objetconstructorest une méthode spéciale appelée lors de l'instanciation avecnewparlerest une méthode que tous les objets de cette classe peuvent utiliser
3. Héritage avec extends et super
JavaScript permet à une classe d'en hériter une autre à l'aide du mot-clé extends. On utilise super() pour appeler le constructeur de la classe parente.
class Chien extends Animal {
constructor(nom, race) {
super(nom); // Appelle le constructeur de Animal
this.race = race;
}
parler() {
console.log(`${this.nom} aboie. C'est un ${this.race}.`);
}
}
const medor = new Chien("Médor", "Labrador");
medor.parler();
Chienhérite deAnimalsuper(nom)permet d'appeler le constructeur parent- La méthode
parlerest redéfinie : on parle ici de surcharge
4. Encapsulation
L'encapsulation consiste à protéger les données internes d'un objet. En JavaScript, on peut utiliser un underscore par convention pour marquer une propriété comme « privée », ou utiliser # pour de vraies propriétés privées (ES2022+).
class CompteBancaire {
#solde = 0;
constructor(titulaire) {
this.titulaire = titulaire;
}
déposer(montant) {
if (montant > 0) {
this.#solde += montant;
}
}
afficherSolde() {
console.log(`${this.titulaire} a ${this.#solde}€ sur son compte.`);
}
}
let compte = new CompteBancaire("Alice");
compte.déposer(100);
compte.afficherSolde();
Le champ #solde n'est accessible qu'à l'intérieur de la classe. Toute tentative de lecture extérieure (compte.#solde) générera une erreur.
5. Polymorphisme
Le polymorphisme permet à des objets de différentes classes de réagir différemment à une même méthode.
const animaux = [
new Animal("Animal"),
new Chien("Milou", "Fox-Terrier")
];
animaux.forEach(a => a.parler());
Chaque objet a sa propre version de parler(). JavaScript appellera automatiquement la méthode définie dans la bonne classe.
6. Prototypes vs classes ES6
Avant l'introduction de class en ES6, la programmation orientée objet en JavaScript s'appuyait sur les prototypes.
function Voiture(marque) {
this.marque = marque;
}
Voiture.prototype.démarrer = function() {
console.log(`${this.marque} démarre`);
};
let v = new Voiture("Renault");
v.démarrer();
Cette méthode fonctionne toujours, mais elle est moins lisible. Le mot-clé class est en réalité une sugar syntax qui repose sur le même système de prototypes en interne.
Résumé du chapitre
Ce chapitre vous a initié à la programmation orientée objet en JavaScript, un paradigme essentiel pour organiser des programmes complexes.
- La POO permet de modéliser des objets avec des propriétés et des méthodes.
- Avec ES6, on peut définir des classes et des instances grâce au mot-clé
class. - Le mot-clé
constructorpermet d'initialiser une nouvelle instance. - L'héritage permet de créer des classes spécialisées à partir de classes génériques (
extends,super()). - L'encapsulation consiste à cacher les données internes. On peut utiliser
#pour rendre une propriété réellement privée. - Le polymorphisme permet à des classes filles de redéfinir des méthodes communes.
- Les prototypes sont la base technique de la POO en JavaScript, mais la syntaxe moderne
classest plus accessible.
La maîtrise de la POO est indispensable pour tout développeur JavaScript souhaitant travailler sur des projets réels, modulaires et maintenables.