Héritage des Prototypes en JavaScript

L'Héritage en JavaScript (chaîne de prototypes)

héritage javascript prototype image

 

 

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"

 
 Dans cet exemple, 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."

 
Dans ce cas, la méthode 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 :

 

  1. Objet : Un étudiant (un objet) possède ses propres propriétés et méthodes (informations dans son dossier).

  2. 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.

  3. 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

 
  1. 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 comme toString() et hasOwnProperty().
  2. 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, comme respirer().
    • 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, comme rouler().
  3. Objets Spécifiques :

    • chats et chiens héritent de animalPrototype. Ils ont leurs propres méthodes spécifiques (miauler() pour les chats et aboyer() pour les chiens) tout en héritant des propriétés et méthodes de animalPrototype et, par extension, de Object.prototype.
    • voiture et velo héritent de vehiculePrototype. Ils ont leurs propres méthodes spécifiques (demarrer() pour la voiture et pedaler() pour le vélo) tout en héritant des propriétés et méthodes de vehiculePrototype et, par extension, de Object.prototype.

 

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éthode respirer.
  • vehiculePrototype contient la méthode rouler.
  • chats et chiens héritent de animalPrototype, ayant accès à respirer et ajoutant leurs propres méthodes (miauler et aboyer).
  • voiture et velo héritent de vehiculePrototype, ayant accès à rouler et ajoutant leurs propres méthodes (demarrer et pedaler).

 

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

 
  1. 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() et hasOwnProperty().
  2. 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éthode respirer().
  3. chien (Enfant) :

    • Cet objet hérite de animalPrototype. Il peut avoir des méthodes spécifiques à un chien, comme aboyer().
  4. rex (Objet spécifique) :

    • rex est une instance spécifique de chien, héritant de toutes les propriétés et méthodes définies dans chien, animalPrototype, et Object.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 de Object.prototype.
  • chien : Hérite de animalPrototype et a une méthode spécifique aboyer.
  • rex : Hérite de chien et a une propriété spécifique nom. 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

 
L’héritage par prototypes en JavaScript est un concept puissant qui permet aux objets de partager des propriétés et des méthodes de manière hiérarchique.
 
Avec la chaîne de prototypes, tu peux créer des structures d’objets modulaires et réutilisables, où chaque objet peut accéder aux comportements définis par ses ancêtres dans la chaîne.
 

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 !

 
 

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *