Aperçu
Proxy et Reflect sont des API introduites par ES6 pour manipuler des objets.
Proxy peut intercepter les opérations sur l'objet cible, telles que la lecture et les appels de fonctions, puis effectuer le traitement des opérations. Il n'opère pas directement sur l'objet, mais, comme le modèle de proxy, il opère via un objet proxy de l'objet, et pendant ces opérations, des opérations supplémentaires nécessaires peuvent être ajoutées.
Reflect peut être utilisé pour obtenir le comportement de l'objet cible. Il est similaire à Object, mais plus lisible, offrant une manière plus élégante de manipuler des objets. Ses méthodes correspondent à Proxy.
Utilisation de base
Proxy
Un objet Proxy se compose de deux parties : target et handler. Lors de la création d'un objet instance via le constructeur Proxy, ces deux paramètres doivent être fournis. target est l'objet cible, et handler est un objet qui déclare le comportement spécifié pour proxifier target.
Méthodes d'instance
get(target, propKey, receiver)
Utilisé pour l'opération de lecture de propKey sur l'objet cible.
La méthode get() peut être héritée.
set(target, propKey, value, receiver)
Utilisé pour intercepter l'opération d'affectation de propKey sur l'objet cible. Si une propriété de l'objet cible lui-même est non accessible en écriture et non configurable, alors la méthode set n'aura aucun effet.
Le quatrième paramètre receiver représente l'objet où se situe le comportement de l'opération d'origine, généralement l'instance Proxy elle-même.
Remarque : en mode strict, si le proxy set ne renvoie pas true, une erreur sera signalée.
apply(target, ctx, args)
Utilisé pour intercepter les appels de fonction, les opérations call et reply. target représente l'objet cible, ctx représente le contexte de l'objet cible, et args représente le tableau d'arguments de l'objet cible.
has(target, propKey)
Utilisé pour intercepter l'opération HasProperty, c'est-à-dire que lorsqu'on détermine si l'objet cible possède la propriété propKey, elle sera interceptée par cette méthode. Cette méthode ne détermine pas si une propriété est une propriété propre à un objet ou une propriété héritée.
Remarque : Cette méthode n'intercepte pas les boucles for...in.
construct(target, args)
Utilisé pour intercepter la commande new. La valeur de retour doit être un objet.
deleteProperty(target, propKey)
Utilisé pour intercepter l'opération delete. Si cette méthode lève une erreur ou renvoie false, la propriété propKey ne peut pas être supprimée par la commande delete.
defineProperty(target, propKey, propDesc)
Utilisé pour intercepter Object.definePro. Si l'objet cible n'est pas extensible, l'ajout d'une propriété qui n'existe pas sur l'objet cible générera une erreur ; si une propriété est non inscriptible ou non configurable, ces propriétés ne peuvent pas être modifiées.
erty opération
getOwnPropertyDescriptor(target, propKey)
Utilisé pour intercepter Object.getOwnPropertyD(). La valeur de retour est un objet descripteur de propriété ou undefined.
ptor propriété
getPrototypeOf(target)
Principalement utilisé pour intercepter les opérations qui récupèrent le prototype de l'objet. Inclut les opérations suivantes :
- Object.prototype._proto_ - Object.prototype.isPrototypeOf() - Object.getPrototypeOf() - Reflect.getPrototypeOf() - instanceof
Remarque : la valeur de retour doit être un objet ou null, sinon une erreur sera signalée. De plus, si l'objet cible n'est pas extensible, la méthode getPrototypeOf doit retourner l'objet prototype de l'objet cible.
isExtensible(target)
Utilisé pour intercepter l'opération Object.isExtensible.
Cette méthode ne peut renvoyer qu'une valeur booléenne ; sinon, la valeur de retour sera automatiquement convertie en booléen.
Remarque : sa valeur de retour doit être cohérente avec la propriété isExtensible de l'objet cible, sinon une erreur sera levée.
ownKeys(target)
Utilisé pour intercepter l'opération de lecture des propriétés propres d'un objet. Cela comprend principalement les opérations suivantes :
- Object.getOwnPropertyNames() - Object.getOwnPropertySymbols() - Object.keys() - or...in
Les membres du tableau renvoyés par la méthode ne peuvent être que des chaînes de caractères ou des valeurs Symbol, sinon une erreur sera signalée.
Si l'objet cible contient des propriétés non configurables, ces propriétés doivent être renvoyées dans le résultat, sinon une erreur sera signalée.
Si l'objet cible n'est pas extensible, il doit renvoyer toutes et uniquement toutes les propriétés contenues dans l'objet cible ; il ne peut pas inclure de propriétés inexistantes, sinon une erreur sera également signalée.
preventExtensions(target)
Intercepter l'opération Object.preventExtensions.
Cette méthode doit renvoyer une valeur booléenne, sinon elle sera automatiquement convertie en booléen.
setPrototypeOf
Principalement utilisé pour intercepter la méthode Object.setPrototypeOf.
La valeur de retour doit être un booléen, sinon elle sera automatiquement convertie en booléen.
Si l'objet cible n'est pas extensible, la méthode setPrototypeOf ne doit pas modifier le prototype de l'objet cible.
Proxy.revocable()
Utilisé pour renvoyer une instance Proxy révocable.
Reflect
En ES6, certaines méthodes d'Object qui appartiennent clairement aux internes du langage ont été déplacées vers l'objet Reflect (actuellement, certaines méthodes existent à la fois sur les objets Object et Reflect), et les nouvelles méthodes futures seront déployées uniquement sur l'objet Reflect.
L'objet Reflect a modifié les résultats de retour de certaines méthodes pour les rendre plus raisonnables.
L'objet Reflect utilise des fonctions pour implémenter les opérations impératives d'Object.
Méthodes statiques
Reflect.get(target, name, receiver)
Rechercher et renvoyer la propriété name de l'objet cible.
Reflect.set(target, name, value, receiver)
Définit la propriété name de target sur value. La valeur de retour est un booléen ; true indique un succès, false indique un échec. Lorsque target est un objet inexistant, une erreur sera signalée.
Reflect.has(obj, name)
C'est la forme fonctionnelle de l'opérateur name in obj, utilisée pour vérifier si la propriété name existe dans l'objet obj. La valeur de retour est boolean. Si obj n'est pas un objet, une TypeError sera signalée.
Reflect.deleteProperty(obj, property)
C'est la forme fonctionnelle de delete obj[property], utilisée pour supprimer la propriété property de l'objet obj. La valeur de retour est boolean. Si obj n'est pas un objet, une TypeError sera signalée.
Reflect.construct(obj, args)
Équivalent à new target(...args).
Reflect.getPrototypeOf(obj)
Utilisé pour lire la propriété _proto_ de obj. Lorsque obj n'est pas un objet, il ne convertit pas obj en objet comme le fait Object, mais signale une erreur à la place.
Reflect.setPrototypeOf(obj, newProto)
Utilisé pour définir le prototype de l'objet cible.
Reflect.apply(func, thisArg, args)
Équivalent à Function.prototype.apply.call(func, thisArg, args). func représente la fonction cible ; thisArg représente l'objet this lié à la fonction cible ; args représente la liste d'arguments transmise lorsque la fonction cible est appelée, qui peut être un tableau ou un objet de type tableau. Si la fonction cible ne peut pas être appelée, une TypeError est levée.
Reflect.defineProperty(target, propertyKey, attributes)
Utilisé pour définir des propriétés pour l'objet cible. Si target n'est pas un objet, une erreur est levée.
Reflect.getOwnPropertyDescriptor(target, propertyKey)
Utilisé pour obtenir l'objet descripteur de la propriété propertyKey de l'objet target. Lorsque target n'est pas un objet, une erreur est levée pour indiquer un paramètre invalide ; le non-objet n'est pas converti en objet.
Reflect.isExtensible(target)
Utilisé pour déterminer si l'objet target est extensible. La valeur de retour est un booléen. Si le paramètre target n'est pas un objet, une erreur est levée.
Reflect.preventExtensions(target)
Utilisé pour rendre l'objet cible non extensible. Si le paramètre cible n'est pas un objet, une erreur est levée.
Reflect.ownKeys(target)
Utilisé pour retourner toutes les propriétés de l'objet cible, équivalent à la combinaison de Object.getOwnPropertyNames et Object.getOwnPropertySymbols.
Utilisation combinée
Les méthodes de l'objet Reflect correspondent un à un aux méthodes de l'objet Proxy. Par conséquent, les méthodes de l'objet Proxy peuvent obtenir le comportement par défaut en appelant les méthodes de l'objet Reflect, puis effectuer des opérations supplémentaires.
Cas d'utilisation étendus
Implémentation du patron Observer.