Les objets dynamiques de JavaScript
JavaScript a modernisé les langages à objets avec la déclaration dynamique. Il n'y a pas de classes comme en langage C, où l'on définit d'abord les méthodes et attributs, et qui servent ensuite de modèles aux instances.
Un objet JavaScript est défini sous la forme syntaxique d'une fonction, qui correspond à une première instance et que l'on clone pour créer d'autre instances.
En outre cette structure est dynamique, on peut lui ajouter durant l'exécution des méthodes (en fait des fonctions internes) et des attributs.
La principale question est de savoir si, une méthode ou un attribut étant ajoutés dynamiquement à un objet, ils deviennent aussi disponibles pour les objets dérivés, ce que l'on va voir.
Un objet est défini comme une fonction
L'objet se crée en définissant un constructeur, on peut l'assigner à un identifieur pour avoir une instance.
function voiture(vitesse)
{
var passagers = 4;
this.vitesse = vitesse;
}
Le constructeur peut avoir des arguments, et il contient des propriétés.
On assigne le constructeur avec le mot-clé new:
mavoiture = new voiture(120);
Il est possible de créer un objet par assignation d'un litéral constitué d'une liste de propriétés/valeurs séparées par une virgule:
mavoiture = { vitesse:120, passagers:4 };
Exemple:
function voiture(v)
{
this.vitesse = v;
}
var mavoiture=new voiture(120)
document.write(mavoiture.vitesse);
L'instance peut être déclarée directement lors de la définition de l'objet à condition d'assigner une valeur aux arguments si on veut y accéder après. Exemple:
var mavoiture = new voiture(v = 200)
{
this.vitesse = v;
}
document.write(mavoiture.vitesse);
Les propriétés d'un objet sont ajoutées en cours de traitement
Un objet peut se définir comme une liste de propriétés, équivalent aux attributs d'une classe.
On peut ajouter une propriété directement à un objet déja défini.
nomobjet.nompropriété = xxxx
On accède à la propriété selon la même syntaxe. Exemple pour l'objet voiture dont la vitesse est une propriété:
alert(voiture.vitesse);
Le prototype peut être modifié après héritages en modifiant une instance
Pour ajouter dynamiquement une propriété et faire qu'elle soit utilisable par tous les clones dérivés du même objet, même s'ils sont créés avant que la propriété ne soit ajoutée, on utilise le mot réservé prototype.
voiture.prototype.consommation = 10;
La propriété consommation appartient maintenant à mavoiture et autres objets éventuellement définis selon voiture.
Exemple d'héritage en JavaScript et modification rétroactive du prototype (avec toutes ses instances):
var mavoiture= new voiture(v = 200)
{
this.vitesse = v;
}
camion = mavoiture;
document.write(camion.vitesse);
voiture.prototype.consommation=50;
document.write("consommation=" + camion.consommation);
Un objet peut contenir d'autres objets assignés comme valeurs d'attributs
Une propriété peut être un autre objet. Dans ce cas
on accède aux propriétés de l'objet contenu par une
chaîne d'identifieurs séparés par un point.
Par exemple, si l'objet mavoiture contient un objet untel
qui a pour constructeur conducteur avec la propriété
age, on accède à age ainsi:
function conducteur(age)
{
this.age = age;
}
untel = new conducteur(25);
mavoiture.conducteur = untel;
document.write(mavoiture.conducteur.age);
On peut aussi intégrer un objet dans un autre sous la forme d'un littéral:
mavoiture = {
vitesse:120,
passagers:4,
untel : {
age:25
}
};
L'objet mavoiture contient l'objet untel défini lui aussi par un litéral. Notez bien les virgules qui séparent les éléments, au lieu de point-virgules.
On accède aux valeurs des attributs comme dans un tableau
On accède aux valeurs des propriétés soit par leur nom, comme on l'a fait précédemment, soit par leur numéro d'ordre dans la liste des propriétés de l'objet, comme avec les éléments d'un tableau, à condition qu'ils correspondant à des objets du document HTML.
Si l'objet ne fait pas partie du document HTML, on accède au contenu par le nom des propriétés ou par un indice si on a ajouté des valeurs selon un indice.
Par exemple, si l'on assigne une valeur par un indice:
voiture[4] = "demo";
on accèdera à la valeur de la même façon:
alert(voiture[4]);
Un objet correspond ainsi à un tableau ambivalent, avec des éléments ordinaux ou des propriétés, contrairement au langage PHP qui utilise les nombres à la fois comme clés et comme ordinaux, ce qui rend le contenu des tableaux indéterminable.
Exemples d'utilisation d'objets
function voiture(vitesse)
{
var passagers = 4;
this.vitesse = vitesse;
}
mavoiture = new voiture(120);
document.write("vitesse: ");
document.write(mavoiture.vitesse);
function conducteur(age)
{
this.age = age;
}
untel = new conducteur(25);
mavoiture.conducteur = untel;
document.write("age conducteur: ");
document.write(mavoiture.conducteur.age)
mavoiture = { vitesse:120, passagers:4, untel : { age:25 } };
document.write("assignement d'un objet litéral: ");
document.write(mavoiture.untel.age);
voiture[1] = "demo";
document.write("indice: ");
document.write(voiture[1]);
Plus d'exemples sont donnés dans les chapitres sur chaque objet prédéfini (retourner au sommaire).