handler.defineProperty()
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.defineProperty()
est une trappe pour Object.defineProperty()
.
Exemple interactif
Syntaxe
var p = new Proxy(cible, {
defineProperty: function (cible, propriété, descripteur) {},
});
Paramètres
Les paramètres suivants sont passés à la méthode defineProperty
. this
est ici lié au gestionnaire.
cible
-
L'objet cible.
propriété
-
Le nom ou le symbole (
Symbol
) de la propriété dont on veut modifier la description. descripteur
-
Le descripteur de la propriété qui est à modifier ou à définir.
Valeur de retour
La méthode defineProperty()
doit renvoyer un booléen qui indique si la propriété a correctement été définie sur la cible.
Description
La méthode handler.defineProperty()
est une trappe pour Object.defineProperty()
.
Interceptions
Cette trappe intercepte les opérations suivantes :
Invariants
Si les contraintes d'invariances suivantes ne sont pas respectées, le proxy renverra une exception TypeError
:
- Une propriété ne peut pas être ajoutée si l'objet cible n'est pas extensible.
- Une propriété ne peut pas être ajoutée ou modifiée pour être rendue non-configurable si elle n'existe pas comme une propriété propre non-configurable de l'objet cible.
- Une propriété ne peut pas être non-configurable s'il existe une propriété correspondante de l'objet cible qui est configurable.
- Si une propriété correspondante existe pour l'objet cible
Object.defineProperty(cible, propriété, descripteur)
ne lèvera pas d'exception. - En mode stricte, si le gestionnaire defineProperty renvoie une valeur fausse (dans un contexte booléen), cela entraînera une exception
TypeError
.
Exemples
Dans le code suivant, on piège l'appel à Object.defineProperty()
.
var p = new Proxy(
{},
{
defineProperty: function (target, prop, descriptor) {
console.log("appelé avec : " + prop);
},
},
);
var desc = { configurable: true, enumerable: true, value: 10 };
Object.defineProperty(p, "a", desc); // "appelé avec : a"
Lorsqu'on appelle Object.defineProperty()
ou Reflect.defineProperty()
, le descripteur passé à la trappe defineProperty
doit respecter une contrainte : seules les propriétés suivants sont utilisables, les propriétés non-standards seront ignorées :
enumerable
configurable
writable
value
get
set
var p = new Proxy({}, {
defineProperty(target, prop, descriptor) {
console.log(descriptor);
return Reflect.defineProperty(target, prop, descriptor);
}
});
Object.defineProperty(p, "name, {
value: "proxy",
type: "custom"
});
// { value: "proxy" }
Spécifications
Specification |
---|
ECMAScript Language Specification # sec-proxy-object-internal-methods-and-internal-slots-defineownproperty-p-desc |
Compatibilité des navigateurs
BCD tables only load in the browser