handler.set()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
La méthode handler.set()
est une trappe permettant d'intercepter les opérations visant à définir ou modifier la valeur d'une propriété.
Exemple interactif
Syntaxe
var p = new Proxy(cible, {
set: function (cible, propriété, valeur, récepteur) {},
});
Paramètres
Les paramètres suivants sont passés à la méthode set
. this
est lié au gestionnaire.
cible
-
L'objet cible.
propriété
-
Le nom ou le symbole (
Symbol
) de la propriété à définir. valeur
-
La nouvelle valeur à définir pour la propriété.
récepteur
-
L'objet intialement visé par l'affectation. Généralement ce sera le proxy lui-même. Le gestionnaire
set
peut également être appelé indirectement, via la chaîne de prototypes ou d'autres façons. Par exemple, si on exécute l'instructionobj.nom = "Jean"
, et qu'obj
n'est pas un proxy ni ne possède de propriéténom
mais s'il possède un proxy dans sa chaîne de prototypes, le gestionnaireset
sera appelé etobj
sera passé en tant que récepteur.
Valeur de retour
La méthode set
doit renvoyer une valeur booléenne. Elle renvoie true
pour indiquer que l'affectation a réussi. Si la méthode set
renvoie false et que l'affectation était exécutée dans du code en mode strict, une exception TypeError
sera levée.
Description
La méthode handler.set
est une trappe qui permet d'intercepter les opérations qui sont utilisées pour définir ou modifier la valeur d'une propriété.
Interceptions
Cette trappe permet d'intercepter les opérations suivantes :
- L'affectation à des propriétés :
proxy[toto] = truc
etproxy.toto = truc
- L'affectation de propriétés héritées :
Object.create(proxy)[toto] = truc
Reflect.set()
Invariants
Si les invariants suivants ne sont pas respectés, le proxy renverra une exception TypeError
:
- Il est impossible de modifier la valeur d'une propriété pour qu'elle soit différente de la valeur de la propriété correspondante de l'objet cible si celle-ci n'est pas accessible en lecture seule et est non-configurable (pour les propriétés de données).
- Il est impossible de modifier la valeur d'une propriété si la propriété correspondante de l'objet cible est une propriété d'accesseur/mutateur dont l'attribut [[Set]] vaut
undefined
. - En mode strict, si le gestionnaire
set
renvoie une valeur fausse (dans un contexte booléen), cela lèvera une exceptionTypeError
.
Exemples
Dans l'exemple qui suit, on intercepte la définition d'une nouvelle propriété.
var p = new Proxy(
{},
{
set: function (target, prop, value, receiver) {
target[prop] = value;
console.log("property set: " + prop + " = " + value);
return true;
},
},
);
console.log("a" in p); // false
p.a = 10; // "property set: a = 10"
console.log("a" in p); // true
console.log(p.a); // 10
Spécifications
Specification |
---|
ECMAScript Language Specification # sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver |
Compatibilité des navigateurs
BCD tables only load in the browser