Les classes

Formation Soyez un druide du JavaScript !

Tutorial Thumbnail

Les classes ont été introduites récemment en JavaScript (avec ECMAScript 2015) pour fournir une syntaxe plus simple pour créer des objets et manipuler l'héritage. En réalité l'objectif était de masquer l'héritage prototypal du langage pour les développeurs habitués aux langages objets basés sur les classes.


Il faut bien comprendre que malgré cette évolution, le JavaScript reste un langage objet basé sur les prototypes et que toute classe est convertie au final en un objet prototype.


Quelques rappels sur les classes

Une classe est une entitĂ© qui va servir Ă  crĂ©er des objets de mĂȘme type. Elle va gĂ©nĂ©ralement ĂȘtre composĂ©e de propriĂ©tĂ©s (on parle aussi d'attributs dans d'autres langages) et de mĂ©thodes dont vont hĂ©riter les objets qui seront crĂ©Ă©s Ă  partir de celle-ci.

Une classe va également posséder un constructeur qui sera appelé systématiquement lors de la création d'un objet pour permettre notamment d'initialiser les propriétés de cet objet.

Dans les langages objet basés sur les classes :

  • Tous les objets sont crĂ©Ă©s en instanciant des classes,
  • Une classe contient toutes les dĂ©finitions des propriĂ©tĂ©s et des mĂ©thodes dont va disposer l'objet. La possibilitĂ© de rajouter ou de supprimer des membres Ă  un objet n'existe pas,
  • L'hĂ©ritage se fait au niveau des classes, en dĂ©finissant une classe mĂšre et des classes filles qui seront des spĂ©cialisations (ou des extensions) de la classe mĂšre.


DĂ©claration et instanciation d'une classe

Pour déclarer une classe en JavaScript, on utilise le mot clé class suivi du nom de la classe et d'une paire d'accolades.

Exemple : déclaration de la classe Personne

class Personne {

}


On ajoute ensuite dans cette classe la méthode constructor(). Cette méthode est reconnue par JavaScript comme étant le constructeur de la classe, elle servira notamment à créer les objets et à initialiser leurs propriétés grùce au passage de paramÚtres.

Exemple : codage du constructeur de la classe Personne

class Personne {
    constructor(nom, prenom, age) {
        this.nom = nom;
        this.prenom = prenom;
        this.age = age;
    }
}
A noter que contrairement au cas des langage objet basés sur les classes (comme C++ ou Java), les propriétés ne sont pas définies à part comme des attributs mais directement dans le constructeur en utilisant le mot clé this pour désigner l'objet courant.


Il reste alors à ajouter les méthodes auxquelles les objets devront pouvoir avoir accÚs.

Exemple : ajout de la méthode decrire() dans la classe Personne

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

    decrire() {
        let description;
        description = `${this.prenom} ${this.nom} est agĂ© de ${this.age} ans.`;
        
        return description;
    }
}


Instanciation & création d'un objet

AprÚs avoir défini complétement la classe, on l'instancie pour créer un objet. Pour cela :

  • on dĂ©clare une variable Ă  laquelle on affecte l'objet crĂ©Ă© Ă  partir de la classe
  • on utilise le mot clĂ© new suivi du nom de la classe pour faire l'instanciation
  • on passe en paramĂštre les valeurs avec lesquelles les propriĂ©tĂ©s de l'objet seront initialisĂ©es.

Exemple : instanciation de la classe Personne

let objPersonne = new Personne('Reese', 'John', 30);


À partir de cet instant, toutes les mĂ©thodes dĂ©finies dans la classe sont accessibles pour l'objet qui a Ă©tĂ© crĂ©Ă© Ă  partir de cette classe.

Exemple : utilisation de la méthode decrire() avec l'objet objPersonne

console.log(objPersonne.decrire());


Activité : codage d'une classe pour l'application de calcul de l'IMC

CrĂ©er une nouvelle version de l'application de calcul d'IMC en utilisant une classe Patient pour crĂ©er les objets qui reprĂ©sentent un patient. Cette classe sera dĂ©finie avec les mĂȘmes propriĂ©tĂ©s et mĂ©thodes que celles dĂ©finies pour les objets de la version prĂ©cĂ©dente.

Tester la classe en créant 2 patients et en affichant pour chacun d'entre-eux :

  • Leur description,
  • Leur IMC,
  • Leur Ă©tat de corpulence.

Le programme doit ĂȘtre conforme Ă  l'exemple donnĂ© pour la version prĂ©cĂ©dente.


Classes dérivées et héritage

Pour créer une classe dérivée qui va hériter des propriétés et des méthodes d'une autre classe, on doit utiliser le mot clé extends

Exemple : création d'une classe Professeur qui hérite de la classe Personne

class Professeur extends Personne {

}

Dans le cas de cet exemple, on dit que la classe Professeur est une classe dérivée de la classe Personne ou encore que la classe Personne est la classe mÚre de la classe Professeur.


Dans le constructeur de la classe dérivée, il faut utiliser le mot clé super pour appeler le constructeur de la classe mÚre.

Exemple : codage du constructeur de la classe Professeur

class Professeur extends Personne {
    constructor(nom, prenom, age, matiere) {
        super(nom, prenom, age);  // Appel du constructeur de la classe Personne
        ï»żthis.matiere = matiere;
    }
}

Dans cet exemple, lorsqu'on créée un objet de la classe Professeur, les propriétés nom, prenom et age sont initialisés par le constructeur de la classe Personne, la propriété matiere spécifique à la classe Professeur est initialisée directement par le constructeur de cette classe.


Attention : super() doit toujours ĂȘtre utilisĂ© avant le mot clĂ© this.


Activité : implémentation de l'héritage par classes pour gérer les professeurs et les élÚves

Créer une nouvelle version de l'application qui permet de créer des objets représentant des professeurs ou des élÚves en utilisant l'héritage par classe.

Pour cette version, on implémentera :

  • La classe Professeur Ă  partir de laquelle seront crĂ©Ă©s les objets reprĂ©sentant les professeurs,
  • La classe Eleve Ă  partir de laquelle seront crĂ©Ă©s les objets reprĂ©sentant les Ă©lĂšves.

Ces deux classes seront dérivées de la classe Personne qui sera chargée d'initialiser les propriétés communes aux professeurs et aux élÚves.

Coder les instructions javascript qui permettent de définir :

  • La classe Personne telle qu'elle a Ă©tĂ© dĂ©finie dans le cours,
  • La classe Professeur en reprenant l'exemple du cours et en ajoutant la mĂ©thode decrire_plus() telle qu'elle a Ă©tĂ© implĂ©mentĂ©e dans la version prĂ©cĂ©dente (cf. hĂ©ritage par prototype),
  • La classe Eleve selon les mĂȘmes modalitĂ©s que la classe Professeur

Ajouter les instructions qui permettent de créer un objet de chaque type (Professeur et Eleve) à partir de ces classes et de tester les méthodes decrire() et decrire_plus() sur chacun de ces objets.


Exercice

Pour voir si tu as bien compris le fonctionnement des classes, n'hésite-pas à t'entrainer de ton cÎté avec les exercices proposés ci-dessous. Prends ton éditeur préféré, créé un nouveau projet contenant un fichier HTML et JavaScript et c'est parti !


Dans cet exercice, il s'agit de reprendre l'application vue dans le chapitre sur les objets et qui permet de créer des objets représentant les personnages d'un jeu. L'objectif sera d'en faire une nouvelle version dans laquelle ces objets seront créés en utilisant les classes.


Créer un nouveau projet correspondant à cette nouvelle version et coder les instructions qui permettent de :

  • DĂ©finir correctement les classes nĂ©cessaires Ă  la crĂ©ation des personnages,
  • CrĂ©er des objets reprĂ©sentant un personnage de chaque catĂ©gorie,
  • Tester les mĂ©thodes associĂ©es Ă  chacun de ces objets.

Niveau DĂ©butant

Technologie utilisée :

Proposer une modification
Antoine
Par Antoine
Rédigé le Mercredi 26 Octobre 2022