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 :
- peut être identifié par un nombre ou une chaîne de caractères
- ne doit pas posséder de paramètre (lire la page Changement ES5 : les fonctions d'accession et de mutation littérales doivent avoir maintenant zéro ou un paramètre. (en anglais) pour plus d'informations)
- ne doit pas apparaître dans un littéral objet avec un autre
getou une autre propriété avec le même identifiant (les codes suivants :{ get x() { }, get x() { } }et{ x: ..., get x() { } }sont interdits).
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"
Spécifications
| Spécification | Statut | 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. |
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 | Pas de support | 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 calculs | Pas de support | Pas de support | 34.0 (34.0) | Pas de support | Pas de support | Pas de support |
Voir aussi
- set
deleteObject.defineProperty()__defineGetter____defineSetter__- Définir des accesseurs et mutateurs, un chapitre du Guide JavaScript