L'Héritage en JavaScript (chaîne de prototypes)
l’Héritage par Prototype
En JavaScript, l’héritage par prototype est une manière fascinante de partager des propriétés et des méthodes entre objets.
Contrairement aux langages orientés objet classiques qui utilisent des classes pour ce faire,
JavaScript utilise un système plus flexible basé sur les prototypes. Ce mécanisme permet aux objets de « hériter » des propriétés et des méthodes d’autres objets, créant ainsi des chaînes de prototypes.
Le Fonctionnement des Prototypes et l’Héritage
Chaque objet en JavaScript a un prototype, qui est simplement un autre objet dont il hérite.
Lorsqu’une propriété ou une méthode est demandée sur un objet,
JavaScript recherche d’abord sur cet objet-même. Si elle n’y est pas trouvée, la recherche se poursuit sur le prototype de l’objet, puis sur le prototype du prototype, et ainsi de suite jusqu’à ce que la propriété soit trouvée ou que la chaîne de prototypes soit complètement explorée.
Exemple de Chaîne de Prototypes
Voici un exemple simple pour illustrer ce concept :
// Définition d'un objet parent
const animal = {
manger() {
console.log("Manger");
}
};
// Définition d'un objet enfant avec animal comme prototype
const chien = Object.create(animal);
chien.aboyer = function() {
console.log("Aboie");
};
// Utilisation des méthodes
chien.manger(); // Affiche "Manger"
chien.aboyer(); // Affiche "Aboie"
Dans cet exemple, l’objet chien
hérite de la méthode manger
de l’objet animal
, tout en ayant sa propre méthode aboyer
.
Cette structure montre comment les objets peuvent partager des fonctionnalités tout en ajoutant des comportements spécifiques.
La Création d’Objets via des Constructeurs
Une autre façon d’utiliser l’héritage par prototype est via des fonctions constructrices. Ces fonctions sont utilisées pour créer des objets tout en définissant leurs prototypes.
Exemple de Constructeurs et Prototypes
// Fonction constructeur pour Animal
function Animal(nom) {
this.nom = nom;
}
// Ajout d'une méthode au prototype de Animal
Animal.prototype.manger = function() {
console.log(`${this.nom} mange`);
};
// Fonction constructeur pour Chien
function Chien(nom, race) {
Animal.call(this, nom); // Appel du constructeur Animal
this.race = race;
}
// Définir le prototype de Chien pour hériter de Animal
Chien.prototype = Object.create(Animal.prototype);
Chien.prototype.constructor = Chien;
// Ajout d'une méthode spécifique à Chien
Chien.prototype.aboyer = function() {
console.log(`${this.nom} aboie`);
};
// Création d'une instance de Chien
const monChien = new Chien('Rex', 'Labrador');
monChien.manger(); // Affiche "Rex mange"
monChien.aboyer(); // Affiche "Rex aboie"
Chien
hérite des méthodes de Animal
tout en ajoutant ses propres méthodes. La ligne Object.create(Animal.prototype)
assure que les objets créés avec Chien
ont accès aux méthodes définies dans Animal
.Le Prototype d’un Objet et son Héritage
Chaque objet en JavaScript a un lien caché vers un autre objet, appelé son prototype.
Ce lien est accessible via la propriété spéciale __proto__
ou via Object.getPrototypeOf(obj)
.
Lorsque vous essayez d’accéder à une propriété d’un objet, JavaScript recherche cette propriété d’abord sur l’objet lui-même, puis remonte la chaîne des prototypes jusqu’à ce qu’il trouve la propriété en question ou atteigne null
.
Exemple Basique
const parent = {
parler() {
console.log("Je parle !");
}
};
const enfant = Object.create(parent);
enfant.marcher = function() {
console.log("Je marche !");
};
enfant.parler(); // "Je parle !" - Hérité du prototype 'parent'
enfant.marcher(); // "Je marche !" - Défini sur 'enfant'
Dans cet exemple, l’objet enfant
n’a pas sa propre méthode parler
, mais il peut toujours l’utiliser car cette méthode existe dans son prototype, parent
.
La Chaîne de Prototypes (Prototype Chain)
La chaîne de prototypes est la clé pour comprendre comment JavaScript résout les propriétés.
Si une propriété n’est pas trouvée sur un objet,
JavaScript suit la chaîne de prototypes jusqu’à ce qu’il trouve la propriété ou atteigne le prototype ultime, Object.prototype
, qui est le prototype de tous les objets standard.
Si une propriété ou méthode n’existe pas dans la chaîne, le résultat sera undefined
.
Exemple de Chaîne de Prototypes
const grandParent = {
couleurYeux: "bleu"
};
const parent = Object.create(grandParent);
parent.cheveux = "brun";
const enfant = Object.create(parent);
enfant.nom = "Léo";
console.log(enfant.nom); // "Léo" - trouvé directement sur 'enfant'
console.log(enfant.cheveux); // "brun" - trouvé sur le prototype 'parent'
console.log(enfant.couleurYeux); // "bleu" - trouvé sur le prototype du prototype 'grandParent'
Ici, enfant
hérite de parent
, qui hérite lui-même de grandParent
. Cette structure en cascade permet de construire des objets complexes sans répéter le code.
Modifications Dynamiques du Prototype
Une des puissances du modèle par prototype est la possibilité de modifier les prototypes à la volée.
Vous pouvez ajouter ou supprimer des propriétés et méthodes sur un prototype, et toutes les instances qui héritent de ce prototype bénéficieront immédiatement de ces changements.
Exemple de Modification Dynamique
const voiture = {
roues: 4
};
const maVoiture = Object.create(voiture);
console.log(maVoiture.roues); // 4
// Ajout d'une nouvelle méthode au prototype
voiture.demarrer = function() {
console.log("La voiture démarre");
};
maVoiture.demarrer(); // "La voiture démarre"
En ajoutant la méthode demarrer
à l’objet voiture
, toutes les instances qui en héritent (comme maVoiture
) obtiennent instantanément accès à cette nouvelle méthode.
Héritage Multiple et Propriétés Redéfinies
JavaScript ne supporte pas directement l’héritage multiple comme certains autres langages (par exemple, le C++). Cependant, vous pouvez créer des objets composites où certaines propriétés sont redéfinies, ce qui permet un comportement similaire.
Exemple de Redéfinition
const animal = {
parler() {
console.log("L'animal parle.");
}
};
const oiseau = Object.create(animal);
oiseau.parler = function() {
console.log("L'oiseau chante.");
};
oiseau.parler(); // "L'oiseau chante."
parler
a été redéfinie dans oiseau
, remplaçant celle héritée d’animal
. Cette redéfinition permet d’adapter le comportement d’un objet en fonction de ses besoins spécifiques, tout en conservant l’héritage des autres propriétés et méthodes.Voici une Représentation Simple du Fonctionnement de l’Héritage des Prototypes en JavaScript
Imagine que chaque objet en JavaScript est comme un étudiant dans une école. Chaque étudiant peut avoir un dossier qui contient des informations spécifiques, comme son nom ou ses compétences.
Cependant, s’il ne trouve pas l’information dans son propre dossier, il peut demander de l’aide à son professeur, qui possède un autre dossier contenant des informations plus générales.
Si le professeur ne connaît pas la réponse, il peut lui aussi demander à son supérieur, et ainsi de suite, jusqu’à ce qu’ils trouvent l’information ou qu’ils atteignent le directeur, qui est la source ultime d’information.
Voici comment cela se traduit en JavaScript :
Objet : Un étudiant (un objet) possède ses propres propriétés et méthodes (informations dans son dossier).
Prototype : Le professeur (le prototype de l’objet) a aussi des informations (propriétés et méthodes) que l’étudiant peut utiliser s’il ne les trouve pas dans son propre dossier.
Chaîne de prototypes : Si le professeur (prototype) ne trouve pas l’information, il remonte la chaîne, en demandant à son propre supérieur (le prototype du prototype), jusqu’à atteindre le directeur (le prototype ultime,
Object.prototype
).
Exemple Simplifié
Prenons un exemple en code pour illustrer :
const etudiant = {
nom: "Jean",
parler() {
console.log("Bonjour, je suis Jean.");
}
};
const etudiantSuperieur = Object.create(etudiant);
etudiantSuperieur.étudier = function() {
console.log("J'étudie la programmation.");
};
// Jean peut parler car c'est dans son propre dossier.
etudiant.parler(); // "Bonjour, je suis Jean."
// L'étudiant supérieur peut parler aussi, car il a hérité de Jean, même si ce n'est pas dans son propre dossier.
etudiantSuperieur.parler(); // "Bonjour, je suis Jean."
// L'étudiant supérieur peut aussi étudier car c'est une compétence ajoutée spécifiquement à son dossier.
etudiantSuperieur.étudier(); // "J'étudie la programmation."
Pour faire simple
- Chaque objet a un lien vers un autre objet appelé prototype.
- Si une propriété ou méthode n’existe pas sur l’objet lui-même, JavaScript la cherche dans son prototype.
- Ce processus continue le long de la chaîne des prototypes jusqu’à ce que la propriété soit trouvée ou que la chaîne atteigne le bout.
C’est comme un système d’entraide, où chaque objet peut demander à son prototype s’il ne trouve pas ce qu’il cherche. Cette approche rend JavaScript très flexible et puissant pour la gestion des objets et des relations entre eux.
Pour te représenter visuellement l’héritage des prototypes en JavaScript, imagine un schéma sous forme d’arborescence. Voici comment il pourrait se présenter :
[Object.prototype]
|
-------------------------
| |
[animalPrototype] [vehiculePrototype]
| |
--------- --------------
| | | |
[chats] [chiens] [voiture] [velo]
Explication du Schéma et de l’héritage
Object.prototype :
- C’est le prototype ultime de tous les objets en JavaScript. Si une propriété ou une méthode n’est pas trouvée sur un objet, la recherche se poursuit dans
Object.prototype
. Il contient des méthodes fondamentales commetoString()
ethasOwnProperty()
.
- C’est le prototype ultime de tous les objets en JavaScript. Si une propriété ou une méthode n’est pas trouvée sur un objet, la recherche se poursuit dans
Prototypes Spécifiques :
- animalPrototype : Un prototype spécifique pour les animaux, héritant de
Object.prototype
. Il peut avoir des méthodes et des propriétés communes à tous les animaux, commerespirer()
. - vehiculePrototype : Un prototype spécifique pour les véhicules, également héritant de
Object.prototype
. Il peut avoir des méthodes et des propriétés communes à tous les véhicules, commerouler()
.
- animalPrototype : Un prototype spécifique pour les animaux, héritant de
Objets Spécifiques :
- chats et chiens héritent de
animalPrototype
. Ils ont leurs propres méthodes spécifiques (miauler()
pour les chats etaboyer()
pour les chiens) tout en héritant des propriétés et méthodes deanimalPrototype
et, par extension, deObject.prototype
. - voiture et velo héritent de
vehiculePrototype
. Ils ont leurs propres méthodes spécifiques (demarrer()
pour la voiture etpedaler()
pour le vélo) tout en héritant des propriétés et méthodes devehiculePrototype
et, par extension, deObject.prototype
.
- chats et chiens héritent de
Exemple de Code Correspondant au schéma ci dessus
Pour illustrer cette chaîne de prototypes avec du code JavaScript, voici un exemple :
// Prototype de base pour les animaux
const animalPrototype = {
respirer() {
console.log("Respire");
}
};
// Création des objets héritant de animalPrototype
const chats = Object.create(animalPrototype);
chats.miauler = function() {
console.log("Miaule");
};
const chiens = Object.create(animalPrototype);
chiens.aboyer = function() {
console.log("Aboie");
};
// Prototype de base pour les véhicules
const vehiculePrototype = {
rouler() {
console.log("Roule");
}
};
// Création des objets héritant de vehiculePrototype
const voiture = Object.create(vehiculePrototype);
voiture.demarrer = function() {
console.log("Démarre");
};
const velo = Object.create(vehiculePrototype);
velo.pedaler = function() {
console.log("Pédale");
};
// Utilisation des objets
chats.respirer(); // "Respire"
chats.miauler(); // "Miaule"
chiens.respirer(); // "Respire"
chiens.aboyer(); // "Aboie"
voiture.rouler(); // "Roule"
voiture.demarrer(); // "Démarre"
velo.rouler(); // "Roule"
velo.pedaler(); // "Pédale"
Description du Code
animalPrototype
contient la méthoderespirer
.vehiculePrototype
contient la méthoderouler
.chats
etchiens
héritent deanimalPrototype
, ayant accès àrespirer
et ajoutant leurs propres méthodes (miauler
etaboyer
).voiture
etvelo
héritent devehiculePrototype
, ayant accès àrouler
et ajoutant leurs propres méthodes (demarrer
etpedaler
).
En utilisant la chaîne de prototypes, vous pouvez facilement structurer vos objets en JavaScript, permettant à des objets plus spécifiques d’hériter et de réutiliser des comportements définis sur des prototypes plus généraux.
Voici une autre représentation visuelle de l’héritage d’une chaîne de prototypes en JavaScript, illustrant la relation entre un objet, son parent, son grand-parent, et finalement la base Object.prototype
.
[Object.prototype] <-- Grand-parent
|
[animalPrototype] <-- Parent
|
[chien] <-- Enfant
|
[rex] <-- Objet spécifique
Explication du Schéma ci dessus
Object.prototype (Grand-parent) :
- C’est le prototype de base pour tous les objets en JavaScript. Toutes les chaînes de prototypes se terminent ici. Ce prototype contient des méthodes communes comme
toString()
ethasOwnProperty()
.
- C’est le prototype de base pour tous les objets en JavaScript. Toutes les chaînes de prototypes se terminent ici. Ce prototype contient des méthodes communes comme
animalPrototype (Parent) :
- Cet objet hérite de
Object.prototype
. Il représente un prototype plus spécifique qui contient des propriétés ou méthodes partagées par tous les animaux, par exemple, une méthoderespirer()
.
- Cet objet hérite de
chien (Enfant) :
- Cet objet hérite de
animalPrototype
. Il peut avoir des méthodes spécifiques à un chien, commeaboyer()
.
- Cet objet hérite de
rex (Objet spécifique) :
rex
est une instance spécifique dechien
, héritant de toutes les propriétés et méthodes définies danschien
,animalPrototype
, etObject.prototype
.
Exemple de Code Correspondant à l’héritage ci dessus
Pour illustrer cette chaîne de prototypes avec du code JavaScript, voici un exemple :
// Prototype de base pour tous les animaux
const animalPrototype = {
respirer() {
console.log("Respire");
}
};
// Prototype pour les chiens, héritant de animalPrototype
const chien = Object.create(animalPrototype);
chien.aboyer = function() {
console.log("Aboie");
};
// Instance spécifique de chien
const rex = Object.create(chien);
rex.nom = "Rex";
// Utilisation des méthodes héritées
rex.respirer(); // "Respire" - Hérité de animalPrototype
rex.aboyer(); // "Aboie" - Hérité de chien
console.log(rex.hasOwnProperty('nom')); // true - Méthode héritée de Object.prototype
Analyse du Code
- animalPrototype : Contient une méthode
respirer
, et hérite deObject.prototype
. - chien : Hérite de
animalPrototype
et a une méthode spécifiqueaboyer
. - rex : Hérite de
chien
et a une propriété spécifiquenom
. Il a accès à toutes les méthodes de ses prototypes parents et grands-parents.
Ces schémas montrent comment les objets en JavaScript héritent les uns des autres via la chaîne de prototypes.
Dans le dernier exemple chaque objet spécifique comme rex
peut accéder aux propriétés et méthodes de ses prototypes parents (chien
), grands-parents (animalPrototype
), et de la base ultime, Object.prototype
. Ce mécanisme permet de structurer et réutiliser le code de manière efficace en JavaScript.
Ce qu’il faut retenir
Cette flexibilité te permet de concevoir des systèmes plus propres et plus efficaces, où les fonctionnalités communes sont centralisées dans des prototypes partagés, évitant la duplication de code.
Que ce soit en utilisant des constructeurs, Object.create()
, ou les classes ES6, tu peux manipuler la chaîne de prototypes pour répondre à tes besoins spécifiques.
Maîtrise ce concept et tu es bien équipé pour exploiter tout le potentiel de JavaScript dans tes projets, créant ainsi des applications plus professionnels.
Pour les développeurs qui veulent perfectionner leurs compétences en JavaScript, j’offre un bonus exclusif. Télécharge notre Guide gratuit « Avec plein de Secrets et d’astuces en JavaScript » pour découvrir des techniques et astuces supplémentaires qui amélioreront ton code et ton expertise.
Le Guide Bonus Exclusif
En allant plus loin, avec ce Guide Bonus Exclusif rien que pour Toi !
Voici un guide complet sur le JavaScript, où tu verras des techniques pour performer en programmation Js.
Ce guide te permettra de perfectionner tes compétences et de devenir un expert JavaScript. Ne le rate pas et développe ton expertise !
En adoptant ce qu’il contient, tu rends ton apprentissage de JavaScript plus performant avec une plus grande facilité tous les jours . Voici de quoi enrichir tout de suite ton savoir-faire ? Le guide complet t’attend !
Quelques liens en supplément de ce cours :
https://developpeur-pro.com/cours-javascript-les-bases
Rejoignez notre Newsletter et Restez Informé !
Vous souhaitez rester à jour avec les dernières tendances et actualités du monde du développement et le métier de développeur. Comment devenir développeur pro ? Rejoignez notre newsletter pour obtenir un accès exclusif à du contenu premium, des astuces de codage, des mises à jour sur les nouvelles fonctionnalités et bien plus encore !
Avantages de l’Inscription
- Restez Informé: Recevez des articles informatifs sur les dernières avancées et les meilleures pratiques de codage et les softkills.
- Promos Exclusives: Accédez à des formations détaillés et à des exemples de code pour améliorer vos compétences en programmation.
- Aperçus des Nouveautés: Soyez parmi les premiers à découvrir les nouvelles fonctionnalités et les frameworks émergents dans l’écosystème du développement FrontEnd et Backend.
- Communauté Engagée: Rejoignez une communauté passionnée de développeurs et partagez vos idées, questions et expériences.
Comment S’Inscrire
C’est simple et rapide ! Remplissez le formulaire d’inscription avec votre adresse e-mail et cliquez sur « S’Inscrire ». Vous recevrez régulièrement notre newsletter dans votre boîte de réception.
L’inscription à notre newsletter est un moyen idéal de rester informé et de progresser dans le domaine de la programmation et du développement pour devenir un développeur professionnel ou une développeuse pro.