JavaScript - La POO
POO : Programmation Orientée Objet, est une manière de programmer, qui va se baser sur des objets.
Sommaire partie 9
Qu'est-ce qu'un objet ?
Petite mise en situation
Exemple d'un vendeur d'ordinateurs qui souhaiterait obtenir la liste des ordinateurs qu'il vend, ainsi que leurs caractéristiques. Le problème se pose de savoir comment enregistrer toutes ces données…
C'est là qu'interviennent les objets : ils vont en fait permettre de regrouper dans une même "structure" toutes les données communes à un même ordinateur.
Encore mieux : on va même pouvoir définir et appliquer des fonctions directement à cette structure, pour en récupérer certaines données (les caractéristiques de l'ordinateur notamment), pour les modifier, pour les comparer, etc.
Un objet, c'est quoi ?
D'abord, une classe…
En POO, on va définir des
classes d'objets, qui regroupent :
- des variables, appelées attributs, qui caractériseront l'objet : ce sont les bases de notre "structure". Un attribut peut très bien être un objet : on dira alors que c'est un sous-objet de notre classe.
- des fonctions, appelées méthodes, qui permettront (entre autre) d'agir sur cet objet.
 |
En JS, certains objets possèdent également des évènements, que l'utilisateur pourra utiliser pour déclencher un script.
C'est un peu particulier, c'est pourquoi nous en parlons séparément. |
Retour à l'exemple. On va définir notre classe "ordinateur" par les attributs :
- cpu : la fréquence du processeur
- disqueDur : la capacité du disque dur
- ram : la quantité de mémoire vive
- carteGraphique : le nom de la carte graphique
On pourra définir les méthodes suivantes :
- description() qui retourne (sous forme de phrase) les caractéristiques de l'ordinateur. Du style : "Cet ordinateur est équipé d'un processeur cadencé à xx GHz, d'un disque dur d'une capacité de … blabla…"
- caracteristiques() : renvoie une liste en HTML des composants avec leur(s) caractéristique(s)
- plusDeRamQue(x) : renvoie
true
si l'ordi possède plus de x Mo de Ram, sinon false
- etc.
Ensuite, des instances…
On a notre
classe d'objet. C'est en quelque sorte un modèle, grâce auquel on va construire tous nos objets "ordinateur" : ces derniers sont appelés des
instances (autrement dit : des "exemplaires", des "répliques") de cette classe d'objets. Les instances s'enregistrent dans des variables.
Par exemple, on pourra créer l'instance "ordiDeJean", dont les attributs auront des valeurs qui correspondent à l'ordinateur de Jean.
 |
Quand on parle d'objet, on désigne soit une classe d'objet, soit une instance : il faut bien en être conscient.
Dans un premier temps, on le précisera, pour ne pas tout mélanger. Mais ensuite, il faudra distinguer les deux sens du mot "objet", selon son contexte… |
Des exemples de classes d'objets
Exemple 1 : un objet "personnage" représentant un personnage dans un jeu de rôle. Parmi les attributs, on trouvera la vie, la mana, la force, etc. et parmi les méthodes, on aura attaquer, boire une potion, changer d'arme, etc.
Exemple 2 : des objets mathématiques, tels que les fractions : on pourra les additionner, les soustraire, les multiplier, les diviser entres elles, simplifier une fraction, etc. L'intérêt, c'est de manipuler des nombres (y compris les résultats) sous forme de fraction.
Deux points de vue…
Un des avantages de la POO, c'est qu'elle sépare le travail en deux : d'un côté, le concepteur de la classe d'objet, et de l'autre, l'utilisateur.
- Le concepteur va définir entièrement la classe d'objet en question (il va définir un certain nombre d'attributs et programmer des méthodes associées à cette classe).
Une fois la classe créée, il pourra l'améliorer (en rajoutant des méthodes ou en optimisant le code existant).
- L'utilisateur va pouvoir utiliser cette classe d'objet dans ses programmes, en créant des instances de l'objet, et en utilisant les méthodes fournies par le concepteur.
Il n'a pas à se soucier de tout le code de la classe (c'est justement le boulot du concepteur) : c'est ça qui est génial.
Dans un premier temps, on va adopter le second point de vue, pour découvrir les nombreux objets qui existent déjà en JS (ce qui n'est pas une mince affaire,…).
Puis ensuite seulement on s'attaquera à la création de nos propres objets, ce qui est un réel jeu de construction…
 |
Avant d'attaquer la pratique, il est conseillé de lire la première partie du chapitre d'introduction à la POO (partie intitulée "Des objets... pour quoi faire ?") du cours de C/C++ |
Comment ça s'utilise ?
Voyons comment s'utilisent des objets.
On connait déjà une classe d'objet : les tableaux, dont le nom est Array.
Son utilisation diffère un peu des objets "classiques", mais on y retrouve néanmoins les éléments typiques des objets.
Créer une instance
Pour créer une instance, on utilise simplement le mot-clé
new.
Code : JavaScript
1 var monTableau = new Array();
Nous avons créé une instance "monTableau" de la classe Array.
Dans les parenthèses, on spécifie des paramètres propres à cette instance de l'objet. Par exemple, pour l'objet "ordinateur", ça peut donner quelque chose comme ceci :
Code : JavaScript
1 var ordiDeJean = new Ordinateur("2 GHz", "120 Go", "512 Mo", "FX 2100");
 |
L'objet (la classe) "ordinateur" n'a pas encore été défini, on ne sait donc pas trop s'il faut indiquer les caractéristiques sous forme de chaînes de caractères, de nombres, …
Ce sera à nous de le choisir au moment de la création de cet objet, et il nous faudra l'indiquer au vendeur, pour qu'il l'utilise correctement. |
Les attributs
Pour accéder à
un attribut (une variable)
d'un objet (d'une instance), on utilise le nom de l'objet, suivi d'un point, puis du nom de l'attribut, comme ceci :
objet.attribut
Un exemple avec l'attribut
length de l'objet "Array" :
Code : JavaScript
1 monTableau.length
Que faire avec les attributs ? Et bien ce sont des variables qui "appartiennent" à l'objet, on peut donc les lire et/ou les modifier (bien que dans certains cas, comme ici, ça ne serve pas à grand chose de les modifier).
Ainsi, si Jean rajoute de la RAM à son ordinateur, on va pouvoir modifier l'attribut correspondant :
Code : JavaScript
1 ordiDeJean.ram = "1024 Mo";
 |
Il est également possible d'accéder à un attribut de cette manière :
Code : JavaScript
1 ordiDeJean["ram"];
Les éléments d'un tableau associatif ne sont en fait que des attributs qu'on rajoute à notre tableau…
|
Les méthodes
Pour exécuter une méthode d'un objet (d'une instance), on utilise la même syntaxe que pour accéder à un attribut, sans oublier les parenthèses (puisqu'une méthode est une fonction).
Un exemple avec la méthode
sort()
de l'objet
Array :
Code : JavaScript
1 monTableau.sort();
Avec notre classe "ordinateur", on va pouvoir créer une méthode qui retournera une description sous forme de caractère. On l'utilisera ainsi :
Code : JavaScript
1 var message = ordiDeJean.description();
2 alert(message);
Destruction d'un objet
 |
Rappel : comment ça se passe dans l'ordinateur lorsqu'on crée un tableau, avec var toto = new Array() ?
Citation : chapitre sur les tableaux
Ce qui se passe :
- L'ordinateur crée un tableau en mémoire (on lui en a donné l'ordre avec
new ).
- Il va également créer une variable dans sa mémoire (on lui a demandé avec
var ).
- Mais schématiquement, voilà ce qui va se passer : en fait, on ne va pas "mettre" le tableau dans la variable (ça ne rentrerait pas, une variable c'est trop petit). On va dire à la variable où se situe notre tableau dans la mémoire de l'ordinateur (c'est beaucoup plus facile comme ça).
|
Revenons à nos objets. Dans cet exemple, notre tableau se retrouve "perdu" dans la mémoire de l'ordinateur :
Code : JavaScript
1 var toto = new Array();
2 toto = null;
Tout ça pour dire que JS possède un système nommé
ramasse-miettes, ou encore
garbage collector pour les anglophones, qui se charge de détruire automatiquement tout ce qui se retrouve ainsi "perdu".
Ainsi, lorsqu'il n'y aura plus aucun "lien" vers un objet, ce dernier sera détruit.
Si on veut détruire un tableau, il suffit donc de modifier la valeur de la variable qui contient l'adresse du tableau. C'est ce qu'on a fait dans l'exemple ci-dessus : le tableau se retrouve "perdu" en mémoire, et le ramasse-miettes le détruira.
 |
Le mot-clé null est généralement utilisé pour désigner "rien". |
Récapitulatif du vocabulaire
- Classe : c'est un modèle, une définition d'une "structure", qui va posséder des attributs et des méthodes.
Exemple : une voiture, qui possède une couleur, une marque, un nom, etc.
- Instance : c'est un exemplaire d'une classe.
Exemple : la voiture de mon oncle, qui a la couleur "rouge", de marque "Pijo" et de nom "Pijo 404".
- Objet : selon le sens, il s'agit d'une classe ou d'une instance.
- Attribut : c'est une variable qui "appartient" à un objet.
Exemple : l'attribut "couleur" pour la voiture.
- Méthode : c'est une fonction propre à une classe. Elle va pouvoir agir sur l'instance à laquelle on l'applique.
Exemple : repeindre la voiture.