Littéraux

Un littéral est une structure d’objet destinée à la création d’un objet unique. C’est-à-dire que, contrairement à une création de structure par l’intermédiaire d’une fonction, le littéral ne permet pas l’instanciation de plusieurs objets adoptant la structure définie : une seule instance d’objet est possible (singleton).

A noter que part abus de langage, on parle plus souvent d’objet JSON que de littéral.

Composition

Un littéral, comme toute structure d’objet, est composé de propriétés et de méthodes. La syntaxe (+ type de valeurs à ajouter) :

 

Propriete : « valeur »
Methode : function () {

}

,

{}

Pas de , après la dernière propriété (bug IE)

Exploitation

L’exploitation d’un littéral peut se faire de deux façons différentes qui dépendront de la connaissance ou non de la composition du littéral.

Exploitation par lecture statique

La composition du littéral vous est connue. Vous pouvez alors accéder à la propriété ou à la méthode qui vous intéresse en utilisant les syntaxes suivantes.

Accès statique à une propriété

nomObjet.unePropriete;

 

Si la propriété est valorisée par un autre littéral, la syntaxe d’accès à une propriété ou à une méthode de ce littéral reste la même, soit :

nomObjet.unePropriete.uneAutrePropriete;
nomObjet.unePropriete.uneAutreMethode();

 

Accès statique à une méthode

nomObjet.uneMethode();

 

Dans le cas de l’accès à une méthode, l’ajout des parenthèses et des éventuels paramètres demandés sont nécessaires à son exécution.

Si la méthode retourne un autre littéral, la syntaxe d’accès à une propriété ou à une méthode de ce littéral reste la même, soit :

nomObjet.uneMethode().uneAutrePropriete;
nomObjet.uneMethode().uneAutreMethode();

 

Exploitation par lecture dynamique

La composition du littéral vous est inconnue (ou partiellement inconnue). L’accès doit se faire par une structure itérative spécifique au parcours d’objet « for in » comme suit :

for (var propriete in objet) {
   // Instructions à exécuter.
}

 

A chaque itération, la variable "propriété" est valorisée par le nom de la propriété trouvée dans le littéral "objet".

En l'état, nous n'avons toujours pas la valeur de la propriété de l'objet et la syntaxe "nomObjet.maPropriete" est inapplicable puisque le nom de la propriété est de type chaîne de caractères.

En JavaScript, un objet est considéré comme un tableau associatif (la notion sera abordée dans la partie "Tableaux (objet Array)"). Ainsi, on peut accéder à une propriété par les syntaxes suivantes.

Accès dynamique à une propriété

nomObjet["unePropriete"];

 

Si la propriété est valorisée par un autre littéral, la syntaxe d’accès à une propriété ou à une méthode de ce littéral reste la même, soit :

nomObjet["unePropriete"]["uneAutrePropriete"];
nomObjet["unePropriete"]["uneAutreMethode"]();

 

Accès dynamique à une méthode

nomObjet["uneMethode"]();

 

Si la méthode retourne un autre littéral, la syntaxe d’accès à une propriété ou à une méthode de ce littéral reste la même, soit :

nomObjet["uneMethode"]()["uneAutrePropriete"];
nomObjet["uneMethode"]()["uneAutreMethode"]();

 

Pour en revenir à notre structure itérative "for in", l’accès aux différentes valeurs se fera alors grâce à la syntaxe précédemment citée ; soit :

for (var propriete in objet) {
   objet[propriete] ;
}

 

Cas d’utilisation : création d'une instance d'objet à partir d'un littéral

Un littéral étant une valeur comme une autre, son utilisation comme argument de fonction devient possible. Ainsi, dans un contexte structure d’objet et instances d’objet, les propriétés peuvent être valorisées depuis un littéral.

Une utilisation très courante et pertinente est de fournir en paramètre facultatif un littéral qui sera parcouru afin de valoriser certaines propriétés de l’objet.

Reprenons l'exemple de la structure d'objet "Personne" et imaginons que lors de l'instanciation nous souhaitions fournir bien plus de valeurs que le sexe, le prénom et le nom. Par l'utilisation d'un littéral, cela devient possible assez aisément :

var romain = new Personne("M", "Romain", "Gervois", {
   age: 25,
   ville: "Paris"
}) ;

 

Pour le moment, nous fournissons les informations facultatives "age" (25) et "ville" (Paris) lors de l'instanciation de l'objet. Mais rien dans notre structure d'objet n'est en place pour traiter ces informations et valoriser les propriétés correspondantes. Il nous faut alors ajouter les instructions suivantes dans le bloc d'instructions de notre structure :

if (arguments.length - Personne.arity == 1) {
   var argument = arguments[arguments.length - 1];
   if (typeof(argument) == "object") {
      for (var propriete in argument) {
         if (this[propriete] == null) {
            this[propriete] = argument[propriete];
         }
      }
   }
}

 

  1. si un seul argument supplémentaire est fourni, un test sur son type est effectué ;
  2. si il est de type "object", on parcourt l'ensemble de ses propriétés et méthodes.

Dans notre exemple, les instructions exécutées lorsqu'une propriété ou une méthode est trouvée permettent de tester l'existence d'une propriété ou d'une méthode (valorisée à null) au sein de la structure d'objet et de la valoriser dans le cas échéant.

Ainsi, si les propriétés "age" et "ville" sont présentes dans notre structure d'objet "Personne" :

this.age = null;
this.ville = null;

 

Elles sont alors valorisées avec les valeurs présentes dans le littéral passé en argument.