Javascript - Objets : le «kit Mac Gyver»
Par nod le 17 septembre 2007, - tuto - Lien permanent
L'essentiel des connaissances sur les objets. Un point rapide et — je l'espère — précis : les bases, la déclaration, la création, l'utilisation, etc.
Introduction
Les objets sont partout en Javascript, je ne vous apprends rien. window, document, Date, Maths, etc. des objets que l'on rencontre a tous les coins de scripts. Mais comment en crée de nouveaux ?
- Soit un objet :
Objet, - possédant :
- une propriété :
- privée :
propPrive, - publique :
propPublique;
- privée :
- une méthode :
- privée :
methPrive, - publique :
methPublique, - privilégiée :
methPrivil.
- privée :
- une propriété :
L'accès aux valeurs
On considère l'objet créé. Deux façons de faire. La seconde alternative étant moins courante. Sans transitions :
À l'ancienne
Objet.propPublique; // lecture
Objet.propPublique = 'valeur'; // assignation
Objet.methPublique(); // exécution
Il n'y a pas tout. Normal, de l'extérieur on n'accède que aux parties publiques :)
L'objet est un tableau
Tout est objet en Javascript, on peut même ajouter que les objets sont comme des tableaux associatifs, suivez le guide :
Objet['propPublique']; // lecture
Objet['propPublique'] = 'valeur'; // assignation
Objet['methPublique'](); // exécution
Lors de l'assignation d'une valeur, il peut se produire une erreur si la variable en question n'a pas été précédemment déclarée dans l'objet, avec cette méthode la variable est renseignée dans l'objet et la valeur affectée.
Implications
On peut dire que un objet est un tableau et donc on peut le parcourir.
Seulement les indexs ne sont pas numériques, la bonne vieille boucle
for (var i=0; i < valeur; i++) ne marcheras
pas. Il existe une autre façon de boucler avec style :
for (var index in Objet) {
alert('Objet['+ index +'] = '+ Objet[index]);
}
Ce qui nous donnera la liste de tout ce que contient l'objet Objet. C'est absolument indispensable.
Création d'un objet
Le plus important est de savoir ce que l'on veux. Si on a besoin des propriétés et méthodes privées alors il faut utiliser la deuxième méthode, sinon la première suffit.
Méthode typique
Je ne présente que la syntaxe courte, puisqu'elle est équivalente de la longue… en plus court.
/* Création d'un objet vide */
Objet = {}
/* Objet non vide */
Objet = {
propPublique: 'valeur',
methPublique: function() {}
}
Il faut noter que la séparation des variables se fait par une virgule et non
un point-virgule. De la même manière que dans la déclaration d'un tableau on
sépare les valeurs par une virgule. La création d'un tableau as aussi une
syntaxe courte : Tableau = ['val1','val2'];.
Méthode atypique
On a vu comment déclarer un objet simple, avec des propriétés et méthodes publiques. Comment faire pour en avoir des privées ? En utilisant les closures « fermetures » on peut le rendre possible. Le terme closure ne sera pas expliqué, flèmme.
/* Création d'un objet vide */
ObjetTmp = function() {}
Objet = new ObjetTmp();
/* Objet non vide */
ObjetTmp = function()
{
var propPrive = 'valeur';
this.propPublique = 'valeur';
function methPrive() {}
this.methPrivil = function() {}
this.methPublique = function() {}
}
Objet = new ObjetTmp();
Variantes
La syntaxe ci-dessus n'est pas unique. Le même résultat pourra être obtenu avec ces déclarations :
function ObjetTmp()
{
var propPrive = 'valeur',
methPrive = function() {}
this.propPublique = 'valeur';
this.methPrivil = function() {}
}
ObjetTmp.prototype.methPublique = function() {}
Objet = new ObjetTmp();
Le choix du type de création de l'objet dépend uniquement du besoin de propriétés et méthodes privées. La méthode atypique est a utiliser avec précautions, la mauvaise utilisation des closures peut conduire a une fuite de mémoire. Ne vous inquiétez pas, pour un objet simple ça n'arrivera pas, il commence à y avoir des risques lorsque l'on commence à l'utiliser pour jouer avec le Html.
« Javascript is magic ! »
Dans les variantes on a pu apercevoir prototype. Killer feature du Javascript, il permet de rajouter a n'importe quel objet n'importe quelle propriété ou méthode. Il permet aussi l'héritage, qui sera traité dans un autre article.

Un
prototype unique d'éditeur Javascript, le dernier en Date
(source PDPhoto.org).
Un exemple tout bête, je veux faire joujou avec les dates dans mon script, et ce serait bien de pouvoir rajouter des méthodes « à moi » à l'objet Date et que ces méthodes puissent être disponibles pour tous les objets déjà crée et pour ceux qui vont l'être. Hé bien c'est possible, simplement, comme ça :
/* J.I.M. ou La killer feature */
Date.prototype.methodePerso = function()
{
var timestamp = this.getTime();
// formater la date en français
return nouvelleDatePerso;
}
Maintenant tous les objets Date auront cette nouvelle méthode, exemple :
var heure = new Date();
alert(heure.methodePerso());
Conclusion
On a pu voir que les objets sont faciles a créer, pratiques à utiliser et qu'ils ont déjà pas mal de possibilités — et encore, on n'a pas parlé d'héritage. Leur structure semblable aux tableaux permet de les parcourir facilement, ce qui est extrêmement pratique pour avoir des détails sur les objets prédéfinis de Javascript, ainsi que pour connaître les différences d'un objet en fonction du navigateur. Un dernier petit bout de code pour la route, à tester dans plusieurs navigateurs :
window.onload = function()
{
var div = document.createElement('div');
for (var index in document.body) {
div.innerHTML += '<strong>;'+index +'</strong>: '+
document.body[index]+"
";
}
document.body.appendChild(div);
}
Cet article est un peu vieux 28/09/2006... soyez sympa