--- title: L'opérateur set slug: Web/JavaScript/Reference/Functions/set tags: - ECMAScript 5 - Functions - JavaScript - Reference translation_of: Web/JavaScript/Reference/Functions/set original_slug: Web/JavaScript/Reference/Fonctions/set ---
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é.
{set prop(val) { . . .}} {set [expression](val) { . . .}}
prop
val
prop.
expression
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
:
set
ou une autre propriété avec la même clé :{ set x(v) { }, set x(v) { } }
et { x: ..., set x(v) { } }
seront interdits)On peut retirer un mutateur d'un objet grâce à l'opérateur {{jsxref("Opérateurs/L_opérateur_delete","delete")}}.
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
.
delete
Si on souhaite retirer un mutateur, on peut simplement utiliser l'opérateur {{jsxref("Opérateurs/L_opérateur_delete","delete")}} :
delete o.courant;
defineProperty
On peut également ajouter un mutateur sur un objet d'ores et déjà créé. Pour cela, on utilisera la méthode {{jsxref("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
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écification | État | Commentaires |
---|---|---|
{{SpecName('ES5.1', '#sec-11.1.5', 'Object Initializer')}} | {{Spec2('ES5.1')}} | Définition initiale |
{{SpecName('ES6', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ES6')}} | Ajout des noms de propriétés calculés |
{{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.functions.set")}}