La syntaxe set permet de lier une propriété d'un objet à une fonction qui sera appelée à chaque tentative de modification de cette propriété.

Syntaxe

{set prop(val) { . . .}}
{set [expression](val) { . . .}}

Paramètres

prop
Le nom de la propriété à lier à la fonction.
val
Un alias pour la variable qui contient la valeur qu'on souhaiterait affecter à prop.
expression
Avec ECMAScript 2015, il est également possible d'utiliser des expressions pour utiliser un nom de propriété calculé à lier à la fonction.

Description

En JavaScript, un mutateur (ou setter en anglais) peut être utiisé afin d'exécuter une fonction à chaque fois qu'on souhaite modifier la valeur d'une propriété donnée. La plupart du temps, les mutateurs sont utilisés avec les accesseurs (getters) afin de créer une pseudo-propriété. Il n'est pas possible d'avoir à la fois un mutateur et une valeur donnée pour une même propriété.

On notera que set :

On peut retirer un mutateur d'un objet grâce à l'opérateur delete.

Exemples

Définir un mutateur sur de nouveaux objets avec un littéral objet

Dans l'exemple qui suit, on définit une pseudo-propriété courant pour un objet o qui, lorsqu'elle recevra une valeur, mettra à jour la propriété log avec la valeur reçue :

var o = {
  set courant (str) {
    this.log[this.log.length] = str;
  },
  log: []
}

On notera que courant n'est pas défini. Toute tentative pour y accéder renverra undefined.

Supprimer un mutateur grâce à l'opérateur delete

Si on souhaite retirer un mutateur, on peut simplement utiliser l'opérateur delete :

delete o.courant;

Définir un mutateur sur un objet existant avec defineProperty

On peut également ajouter un mutateur sur un objet d'ores et déjà créé. Pour cela, on utilisera la méthode Object.defineProperty().

var o = { a:0 };

Object.defineProperty(o, "b", { set: function (x) { this.a = x / 2; } });

o.b = 10; // On utilise le setter, qui affecte 10 / 2 (5) à 'a'
console.log(o.a) // 5

Utiliser un nom de propriété calculé

var expr = "toto";

var obj = {
  bidule: "truc",
  set [expr](v) { this.bidule = v; }
};

console.log(obj.bidule); // "truc"
obj.toto = "bidule";      // le mutateur est utilisé
console.log(obj.bidule); // "bidule"

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 Latest Draft (ECMA-262)
La définition de 'Method definitions' dans cette spécification.
Projet  

Compatibilité des navigateurs

Update compatibility data on GitHub
OrdinateurMobileServeur
ChromeEdgeFirefoxInternet ExplorerOperaSafariWebview AndroidChrome pour AndroidEdge MobileFirefox pour AndroidOpera pour AndroidSafari pour iOSSamsung InternetNode.js
Support simpleChrome Support complet 1Edge Support complet OuiFirefox Support complet 2IE Support complet 9Opera Support complet 9.5Safari Support complet 3WebView Android Support complet 1Chrome Android Support complet 18Edge Mobile Support complet OuiFirefox Android Support complet 4Opera Android Support complet OuiSafari iOS Support complet OuiSamsung Internet Android Support complet Ouinodejs Support complet Oui
Computed property namesChrome Support complet 46Edge Support complet OuiFirefox Support complet 34IE Aucun support NonOpera Support complet 47Safari Aucun support NonWebView Android Support complet 46Chrome Android Support complet 46Edge Mobile Support complet OuiFirefox Android Support complet 34Opera Android Support complet OuiSafari iOS Aucun support NonSamsung Internet Android Support complet 5.0nodejs Support complet Oui

Légende

Support complet  
Support complet
Aucun support  
Aucun support

Voir aussi

Étiquettes et contributeurs liés au document

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