Le JavaScript permet de programmer en objet, mais son gros problème, c’est de ne pas le permettre d’une façon aussi claire que des langages comme le C++ ou le Python. L’ennui, c’est que le JavaScript est de plus en plus utilisé pour construire de grosses applications, notamment grâce à l’essor du HTML5, et donc on aimerait bien pouvoir manier la POO avec ce langage… Nous allons voir ici comment faire, ou plutôt comment bidouiller pour recréer la POO.
Une classe
Le JavaScript est un langage assez paradoxal en fait, il n’a pas vraiment de syntaxe claire pour construire des objets et pourtant, il utilise ces derniers en masse : une fonction, un array, une chaîne de caractères, toutes ces choses sont autant d’exemples d’objets natifs que l’on trouve dans le JavaScript. Ainsi, en JavaScript, une classe, ce sera une fonction :
function Classe() {
}
var Classe = function() {
}
Comme vous le voyez, plusieurs moyens sont possibles pour créer une fonction (et donc une classe). Le plus souvent, on préférera la seconde méthode, car elle permet de bien différencier les deux cas : création de fonction et création de classe.
Méthodes et attributs
Un attribut (ou propriété) sera une variable définie dans la classe (donc dans notre fonction). Nous créerons donc nos attributs de cette manière :
var Classe = function() {
var attr0, attr1, attr2;
var autre_attribut;
var attribut_avec_une_valeur_par_defaut = 'toto';
}
Une fonction étant un objet stocké dans une variable, les méthodes se créent de la même façon :
var Classe = function() {
var methode = function() {
}
var attr0, attr1, attr2;
var autre_attribut;
var attribut_avec_une_valeur_par_defaut = 'toto';
}
Les attributs créés sont bien entendu utilisables dans la méthode puisqu’ils se situent dans l’espace de portée au-dessus de celui de la méthode. Si vous modifiez un attribut dans une méthode et que vous réutilisez ce même attribut dans une autre méthode, il conservera sa valeur modifiée.
Portée
Si vous êtes habitué à la POO, vous vous posez sûrement une question importante : quelle portée possèdent les attributs et méthodes créés de cette façon ? La réponse est simple : privée. Bon, pour les attributs, c’est plutôt cool (principe d’encapsulation), mais pour les méthodes, c’est moyen car si on ne peut pas utiliser notre objet de l’extérieur, il ne sert pas à grand-chose… Pour créer des méthodes publiques, c’est simple :
var Classe = function() {
var methode = function() {
}
this.methodePublique = function() {
}
var attr0, attr1, attr2;
var autre_attribut;
var attribut_avec_une_valeur_par_defaut = 'toto';
}
Bien entendu, une méthode publique peut accéder aux attributs et méthodes privés. Vous pouvez également déclarer des attributs publics de cette manière, mais c’est toujours l’éternel débat : respecter l’encapsulation ou pas. Petite remarque importante : n’oubliez surtout pas de ne pas mettre var devant ce genre de ligne (sinon, ça plantera) !
Instanciation et utilisation de l’objet
On sait donc créer une classe, c’est bien, mais encore faut-il savoir l’utiliser. Pour instancier une classe et obtenir un objet, on retrouve une syntaxe assez familière :
var objet = new Classe();
Et pour utiliser tout ce qui est public, là encore, rien d’extraordinaire :
objet.methodePublique();
Où est le constructeur ?
En voila, une question importante ! En fait, le constructeur, c’est toute la fonction elle-même (Classe dans notre exemple). Ainsi, nos attributs ont l’air d’être créés un peu n’importe où vus comme ça mais ils sont en fait créés dans le constructeur !
Si vous avez bien compris, vous avez donc la réponse à la dernière question qu’on va se poser : et si on veut des paramètres (ou arguments) pour notre objet (par exemple la couleur par défaut d’un objet) ? Ces paramètres, dans tous les autres langages, il faut les indiquer dans le constructeur. Ici, c’est pareil :
var Classe = function(parametre0) {
var methode = function() {
}
this.methodePublique = function() {
}
var attr0, attr1, attr2;
var autre_attribut;
var attribut_avec_une_valeur_par_defaut = 'toto';
var utilisons_le_parametre = parametre0;
}
var objet = new Classe('bleu');
objet.methodePublique();
À noter que, bien évidemment, les méthodes ne sont que des fonctions dans une classe alors bien sûr, vous pouvez leur faire utiliser des paramètres comme vous le feriez avec n’importe quelle autre fonction…
Et c’est pas fini !
Enfin si, c’est fini, mais juste pour ce tutoriel car avec ça, vous allez pouvoir utiliser la POO de base sans trop de problèmes. Il faut savoir qu’il existe d’autres façons de modifier une classe, notamment avec l’utilisation de prototype, un aspect un peu particulier qui fera l’objet d’un autre tutoriel.
8 commentaires
Je ne sais pas ce que tu appelles grosse applications, mais JS n’a jamais été fait pour cela ^^
Est ce que tu as jeté un oeil à Coffeescript, Dart ou TypeScript ?
Les 3 langages ont le même but mais des approches différentes et il y en a pour tous les goûts :)
@YopSolo: Fait pour ça ou non, il peut quand même servir à créer de grosses applications comme des jeux par exemple, 2D ou 3D, il ne faut pas oublier que HTML5 utilise massivement JavaScript…
Et si personne ne faisait de grosses applications, les développeurs de navigateurs ne s’embêteraient pas à l’optimiser à mort et pourtant une prochaine version de Firefox (la 18 si je me souviens bien) intégrera un moteur JavaScript plus évolué qui boostera les performances lorsque les scripts JS sont faits pour durer longtemps.
Est ce que tu peux me donner un exemple de jeu javascript 2d/3d qui est pour toi une grosse application.
@YopSolo: Je n’en ai pas sous la main, ce n’est pas vraiment le genre de choses qui m’intéressent, mais franchement, c’est pas dur à imaginer.
Ca m’a pris un peu de temps mais j’ai retrouvé une video que j’ai vu il y a 5-6 mois.
Bob (oui c’est son prenom) am-ne très bien le sujet
http://www.youtube.com/watch?v=9RCuW6K1afs
Le passage dont je te parle commence a 4:00 et dure environ 2 minutes.
Le reste de la vidéo parle de Dart et de JS et c’est aussi très intéressant a condition d’avoir du temps devant soi.
bon visionnage
YopSolo
Tes commentaires ne sont pas utiles pour ce tutoriel, Jérémy nous offre aux développeurs une approche simplifiée pour débuter la programmation JS en objet. Si tu as des idées d’optimisation en rapport avec ce sujet balance.
Mais les gens comme toi qui s’expriment juste pour dire « y’a mieux » ne font rien avancer.
Il est possible de faire de la POO en javascript, mais je galère pas mal (je viens de java où c’est vraiment fait pour).
En particulier, pour la segmentation de code en fichiers et packages, je n’ai rien trouvé de vraiment satisfaisant. Or, je voudrais programmer un petit jeu 2D, et le nombre de classes explose rapidement. Quelqu’un a des idées pour structurer tout ça (et pas tout mettre dans un seul fichier, ce qui est illisible) ?
[…] Faire de la Programmation Orientée Objet en JavaScript. Le JavaScript permet de programmer en objet, mais son gros problème, c’est de ne pas le permettre d’une façon aussi claire que des langages comme le C++ ou le Python. L’ennui, c’est que le JavaScript est de plus en plus utilisé pour construire de grosses applications, notamment grâce à l’essor du HTML5, et donc on aimerait bien pouvoir manier la POO avec ce langage… Nous allons voir ici comment faire, ou plutôt comment bidouiller pour recréer la POO. […]