L'opérateur get

La syntaxe get permet de lier une propriété d'un objet à une fonction qui sera appelée lorsqu'on accédera à la propriété.

Syntaxe

{get prop() { ... } }
{get [expression]() { ... } }

Paramètres

prop
Le nom de la propriété à lier à la fonction.
expression
Avec ECMAScript 6, il est également possible d'utiliser des expressions renvoyant un nom de propriété calculé pour le lier à une fonction.

Description

Il est parfois utile de créer une propriété qui renvoie une valeur dynamique calculée, ou de ne pas avoir recours à l'appel explicite d'une méthode pour renvoyer le statut d'une variable interne. En JavaScript, il est possible de faire cela en utilisant un accesseur. Il n'est pas possible d'avoir simultanément un accesseur  assimilé à une propriété et d'avoir cette propriété initialisée à une valeur, mais il est possible d'utiliser un accesseur et un mutateur pour créer une sorte de pseudo-propriété.

On notera que l'opérateur get :

Un accesseur peut être supprimé grâce à l'opérateur delete.

Exemples

Définir un accesseur avec l'opérateur get

Ce code va créer une pseudo-propriété dernier de l'objet o qui va retourner la dernière entrée du tableau o.journal :

var o = {
  get dernier() {
    if (this.journal.length > 0) {
      return this.journal[this.journal.length - 1];
    }
    else {
      return null;
    }
  },
  journal: []
}

Notez qu'essayer d'assigner à dernier une valeur ne le modifiera pas.

Supprimer un accesseur avec l'opérateur delete

delete o.dernier;

Définir un accesseur sur des objets existants grâce à defineProperty

Afin d'ajouter un accesseur à un objet qui existe déjà, on peut utiliser la méthode Object.defineProperty().

var o = { a:0 }

Object.defineProperty(o, "b", { get: function () { return this.a + 1; } });

console.log(o.b) // Utilise l'accesseur qui génère a + 1 (qui correspond à 1)

Utiliser un nom de propriété calculé

Note : Les noms de propriétés calculés font partie d'ECMASript 6, à ce titre, ils sont considérés comme expérimentaux et ne sont pas nécessairement supportés largement par les navigateurs. Le code qui suit entraînera une erreur de syntaxe avec les environnements incompatibles.

var expr = "toto";

var obj = {
  get [expr]() { return "truc"; }
};

console.log(obj.toto); // "truc"

Accesseurs mémoïsés

Les accessers permettent de définir des propriétés sur un objet mais ils ne calculent pass la valeur de la propriété tant qu'il n'y a pas d'accès envers celle-ci. Un accesseur délègue le coût de calcul jusqu'au moment où la valeur est vraiment nécessaire (si cette dernière n'est jamais utilisée, cela ne coûte alors rien).

Une technique supplémentaire pour optimiser ou retarder le calcul d'une valeur d'une propriété et de la mettre en cache pour les accès ultérieurs consiste à utiliser des accesseurs intelligents « mémoïsés ». La valeur est calculée lors du premier appel de l'accesseur puis est mise en cache afin que les appels ultérieurs renvoient la valeur en cache sans la recalculer. Cette méthode peut s'avérer utile dans plusieurs situations :

  • Si le calcul de la valeur est coûteux (il consomme beaucoup de RAM ou de temps CPU, il crée de nouveaux threads, il utilise des fichiers distants, etc.).
  • Si la valeur est utilisée plus tard ou, dans certains cas, n'est pas utilisée du tout.
  • Si elle est utilisée plusieurs fois, il n'est pas nécessaire de la recalculer car sa valeur ne changera pas.

Cela signifie qu'un tel accesseur ne doit pas être utilisé si la valeur peut être modifiée au cours du temps. En effet, avec la définition qu'on vient de lui donner, un tel accesseur ne recalculera pas la valeur.

Dans l'exemple suivant, l'objet possède un accesseur en propriété propre. Lors de l'accès à la propriété, la propriété est retirée de l'objet puis réajoutée mais sous forme d'une propriété de donnée (et non d'un accesseur). Enfin, la valeur est renvoyée :

get notifier() {
  delete this.notifier;
  return this.notifier = document.getElementById("bookmarked-notification-anchor");
},

Cet exemple est utilisé dans le code de Firefox code, notamment dans le code du module XPCOMUtils.jsm qui définit la fonction defineLazyGetter().

Spécifications

Spécification État Commentaires
ECMAScript 5.1 (ECMA-262)
La définition de 'Object Initializer' dans cette spécification.
Standard Définition initiale
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Method definitions' dans cette spécification.
Standard Ajout des noms de propriétés calculés.
ECMAScript 2017 Draft (ECMA-262)
La définition de 'Method definitions' dans cette spécification.
Projet  

Compatibilité des navigateurs

Fonctionnalité Chrome Firefox (Gecko) Internet Explorer Opera Safari
Support simple 1 2.0 (1.8.1) 9 9.5 3
Noms de propriétés calculés 46 34 (34) Pas de support Pas de support Pas de support
Fonctionnalité Android Chrome pour Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Support simple (Oui) (Oui) 1.0 (1.8.1) (Oui) (Oui) (Oui)
Noms de propriétés calculés 47 Pas de support 34.0 (34.0) Pas de support Pas de support Pas de support

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : SphinxKnight, BenoitL, titouandk, fscholz, teoli, Jeremie, matteodelabre
 Dernière mise à jour par : SphinxKnight,