Prototypes : le mécanisme sous les classes
La chaîne de prototypes sous les classes.
Objectifs
À la fin de cette leçon, vous saurez :
- expliquer que les classes JS reposent sur les prototypes ;
- suivre une recherche de propriété dans la chaîne de prototypes ;
- utiliser Object.create pour créer un héritage manuel.
La question qui dérange
Dans la leçon précédente, t1 et t2 ont chacun leurs propriétés... mais où vit la méthode decrire() ? Pas sur chaque instance : elle vit une seule fois sur un objet caché appelé prototype, partagé par toutes les instances.
t1 ──→ prototype de Tache { basculer(), decrire() }
t2 ──→ (le MÊME prototype)
Quand vous écrivez t1.decrire() :
- t1 a-t-il
decrire? Non. - Son prototype l'a-t-il ? Oui → exécution, avec
this = t1.
C'est la chaîne de prototypes : JavaScript remonte jusqu'à trouver — ou renvoie undefined.
Vérifier et créer à la main
const animal = {
parler() { console.log("..."); },
};
const chien = Object.create(animal); // chien a animal comme prototype
chien.aboyer = function () { console.log("Wouf"); };
chien.aboyer(); // trouvé SUR chien
chien.parler(); // pas sur chien → trouvé sur animal
Les classes sont du sucre
class Tache {}
// est fonctionnellement proche de :
function Tache(titre) { this.titre = titre; }
Tache.prototype.basculer = function () { ... };
La syntaxe class n'invente rien : elle formate proprement ce mécanisme prototype. Pourquoi le savoir ? Trois raisons pratiques :
- Lire des erreurs du type « x.fonction is not a function » = la chaîne ne contient pas ce nom.
- Comprendre pourquoi les méthodes sont partagées mais les propriétés non.
- Décoder des bibliothèques anciennes ou très optimisées écrites en prototypes purs.
Exercice
- Créez deux instances de Tache ; vérifiez qu'elles partagent le même constructeur (
t1.__proto__ === t2.__proto__). - Avec Object.create, fabriquez
adminqui hérite d'utilisateuret ajoutesupprimerTout(). - Ajoutez dynamiquement une méthode au prototype de Tache APRÈS création des instances : sont-elles concernées ?
Résumé
- Les instances pointent vers un prototype commun ; la recherche remonte la chaîne.
- Méthodes = prototype ; propriétés propres = instance.
- class = syntaxe moderne du mécanisme prototype.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 3. Elles y accèdent immédiatement : le prototype est vivant, la recherche se fait À CHAQUE accès. C'est aussi un piège : modifier un prototype natif (Array.prototype...) affecte tout votre programme — pratique à proscrire hors cas extrêmes documentés.