5-POO Js
5-POO Js
5-POO Js
POO en JavaScript
Table des matières
1. Introduction......................................................................................................................................................................2
2. JavaScript et les objets......................................................................................................................................................2
1.1. Objets.......................................................................................................................................................................2
1.2. Pseudo objets...........................................................................................................................................................3
2. Éléments de base de JavaScript........................................................................................................................................3
2.1. Fonctions..................................................................................................................................................................3
2.2. Closures....................................................................................................................................................................4
2.3. Mot clé this..............................................................................................................................................................5
3. Structures des objets avec JavaScript...............................................................................................................................6
3.1. Structure simple.......................................................................................................................................................6
3.2. Prototypage..............................................................................................................................................................8
3.3. Combinaison des deux approches............................................................................................................................9
5-POO_js.odt 1
Classe de terminale SI
1. Introduction
JavaScript diffère considérablement des langages objet classiques tels que Java et C++
car il se fonde sur la programmation orientée objet par prototype. Son intérêt consiste en
son aspect dynamique permettant de modifier la structure des objets après leur création.
Le code JavaScript dans le navigateur devenant de plus en plus complexe, une structura-
tion de ces traitements est de plus en plus nécessaire afin de les modulariser, de les
rendre maintenables, réutilisables et facilement évolutifs. De nombreuses bibliothèques
JavaScript sont actuellement disponibles sur Internet qui utilisent toutes les subtilités des
concepts objet du langage afin de rendre la mise en œuvre de JavaScript plus simple et
de faciliter son utilisation pour des fonctionnalités graphiques liées à (X)HTML et CSS.
1.1. Objets
En JavaScript, la notion de classe n'existe pas et le langage n'est pas typé. Le langage
JavaScript permet de créer simplement un objet en se fondant sur l'objet Object ou en uti-
lisant une forme littérale dont la syntaxe est décrite par la notation JSON. Le code suivant
illustre la création d'un objet "vierge" avec ces deux techniques:
1. var obj1 = new Object(); // A partir de l'objet Object
Le langage considère les objets en tant que tableau associatif : chaque élément d'un objet
correspond à une "entrée" dans l'objet. Cette dernière est identifiée par un nom, le type
n'étant connu qu'à l'exécution. Ainsi, un attribut d'un objet correspond à une entrée avec
un type quelconque et une méthode à une entrée dont le type attendu est fonction. Une
de caractéristiques d'un tableau associatif est le fait que tout est dynamique. En effet, il
est possible d'ajouter, de modifier et de supprimer les entrées de l'objet tout au long de sa
vie. Le code suivant illustre la mise en œuvre de ces principes en utilisant les différentes
notations supportées par JavaScript :
var obj = new Object();
obj["attribut"] = "valeur1";
// similaire à obj.attribut = "valeur1";
5-POO_js.odt 2
Classe de terminale SI
5-POO_js.odt 3
Classe de terminale SI
Par la suite, nous désignons par le terme méthode une fonction lorsqu'elle est rattachée à
un objet. Une fonction en elle-même existe et peut être appelée sans pour autant avoir
d'objet rattaché. Lorsqu'une fonction est rattachée à un objet, la référence à cette dernière
est appelée méthode. Si une fonction est définie explicitement pour un objet, elle est éga-
lement désignée par méthode.
Une des conséquences est que les fonctions JavaScript possèdent des attributs et des
méthodes. L'attribut qui nous intéresse particulièrement est prototype. Comme son nom
l'indique, il va être utilisé pour mettre en œuvre la programmation orientée objet par proto-
type en permettant de définir la structure des objets.
Les fonctions JavaScript possèdent également d'autres particularités. Tout d'abord, le lan-
gage ne se fonde pas sur le concept de signature afin de les identifier à l'exécution mais
uniquement sur leurs noms. Cela conduit à des comportements assez inattendus puisque,
quand deux fonctions portent le même nom, c'est la dernière définie qui est exécutée et
ce quelque soit les paramètres qui lui sont passés. Le code suivant illustre ce fonctionne-
ment:
function test(parametre1) { alert(parametre1); }
Afin de gérer les paramètres passés à une fonction, le langage JavaScript met à disposi-
tion la variable arguments dans les fonctions. Cette dernière correspond à un tableau
contenant les différents paramètres passés à la fonction lors de son appel. Cet élément
de langage offre la possibilité à une fonction de gérer différents appels avec un nombre
de paramètres différent. Le code suivant illustre l'utilisation de la variable arguments dans
une fonction :
function test() {
alert("Nombre de paramètres: " + arguments.length);
for(var i=0; i<arguments.length; i++) {
alert("Paramètre " + i + ": " + arguments[i]);
}
}
test("valeur1", "valeur2");
test("valeur1", "valeur2", "valeur3", "valeur4");
2.2. Closures
D'autres fonctionnalités de JavaScript en rapport avec les fonctions sont le support par le
langage des closures et la possibilité de définir des fonctions dans le corps de fonctions.
Les closures correspondent à des fonctions particulières qui peuvent utiliser des variables
définies en dehors de leur portée. Une utilisation intéressante consiste en la possibilité
d'accéder aux variables définies dans une fonction contenant à partir de la fonction conte-
nue, comme l'illustre le code suivant :
function maFonction(parametre) {
var maVariable = parametre;
function monAutreFonction() {
alert("maVariable : " + maVariable);
5-POO_js.odt 4
Classe de terminale SI
return monAutreFonction;
}
5-POO_js.odt 5
Classe de terminale SI
pour ces paramètres tandis que la seconde (call) les place en paramètre de l'appel. Le
code suivant illustre la mise en œuvre de ces deux méthodes :
function maFonction(parametre1, parametre2) {
alert("Parametres: " + parametre1 + ", " + parametre2 + " - Attribut: " +
this.attribut);
}
var obj1 = {
attribut: "valeur1",
}
var obj2 = {
attribut: "valeur2",
}
this.methode = function() {
alert("Attributs: " + this.attribut1 + ", " + this.attribut2);
}
}
5-POO_js.odt 6
Classe de terminale SI
obj.methode();
Dans le code ci-dessus que la fonction MaClasse permet de définir le nom de la classe et
correspond au constructeur de cette dernière. Ainsi les paramètres de la fonction per-
mettent d'initialiser la classe. Nous notons également l'utilisation du mot clé this qui per-
met de définir des éléments publiques de la classe.
Attention à ne pas oublier le mot clé this pour référencer les attributs attribut1 et attribut2
dans la méthode methode sous peine d'erreurs et même si l'on se trouve dans la classe
elle-même.
Le précédent exemple permet donc de définir une classe Ma-
Classe dont la figure suivante illustre sa structure dans un dia-
gramme de classes UML.
Cette première approche permet de gérer la visibilité des élé-
ments d'une classe. En effet, en supprimant this. devant les attri-
buts attribut1 et attribut2, ces derniers ne sont plus accessibles qu'en interne à la classe
et sont alors de visibilité privée, comme l'illustre le code suivant :
function MaClasse(parametre1, parametre2) {
var attribut1 = parametre1;
var attribut2 = parametre2;
this.methode = function() {
alert("Attributs: " + attribut1 + ", " + attribut2);
}
}
try {
obj.methode();
}
catch(err) {
print(err);
}
5-POO_js.odt 7
Classe de terminale SI
// Génère une erreur car la méthode ne peut pas être résolue à l'extérieur de la
classe
Cette approche consiste en la manière la plus simple de mettre en œuvre des classes en
JavaScript mais elle souffre d'une limitation. En effet, à chaque fois que la méthode de
construction de l'objet est appelée, une nouvelle méthode methode est créée pour l'objet.
Aussi, si dix objets de type MaClasse sont créés, dix méthodes methode sont créées. Cet
aspect a des impacts sur les performances et la consommation mémoire surtout dans des
applications JavaScript utilisant beaucoup d'objets du type MaClasse. Le comportement
souhaité serait que tous les objets pointent vers la méthode methode. La fonctionnalité de
prototypage de JavaScript permet de pallier à cet aspect.
3.2. Prototypage
Le concept de prototypage correspond à spécifier une sorte de modèle indépendamment
du constructeur afin d'initialiser chaque objet à sa création. Comme nous l'avons mention-
né précédemment, la spécification de ce modèle se réalise en se fondant sur la propriété
prototype de la classe Function. Il convient donc ainsi de toujours de créer une fonction
constructeur afin de définir une classe. Cependant, contrairement à l'approche précé-
dente, les éléments de la classe ne sont plus tous définis dans cette fonction.
La propriété prototype s'initialise en se fondant sur un objet ou un tableau associatif. Le
code suivant illustre l'adaptation de la classe MaClasse en se fondant sur le prototypage :
function MaClasse(parametre1, parametre2) {
this.attribut1 = parametre1;
this.attribut2 = parametre2;
}
MaClasse.prototype = {
methode: function() {
alert("Attributs: " + this.attribut1 + ", " + this.attribut2);
}
}
5-POO_js.odt 8
Classe de terminale SI
MaClasse.prototype = {
methode: function() {
alert("Attribut: " + this.attribut);
}
}
5-POO_js.odt 9