Aller au contenu

Proxy JavaScript et Reflect

JavaScript les proxys permettent d’intercepter et de modifier les opérations sur des objets. Ils offrent un moyen puissant d’améliorer votre programmation en rendant votre code plus flexible et plus facile à maintenir. En apprenant à utiliser les proxys, vous pouvez créer un code plus robuste et plus sophistiqué, améliorant ainsi vos pratiques globales de codage JavaScript.

Introduction au Proxy en JavaScript

Un objet Proxy en JavaScript vous permet d’ajouter un comportement personnalisé à un objet. Il vous permet d’intercepter et de personnaliser des opérations comme l’accès aux propriétés, l’affectation et les appels de fonctions. C’est utile pour la journalisation, la validation ou la modification du fonctionnement d’un objet dans votre application.

Syntaxe du Proxy


javascript
const proxy = new Proxy(target, handler);
  • target : l’objet d’origine que vous souhaitez proxifier.
  • handler : un objet contenant des traps pour intercepter les opérations.

Comprendre le trap get

Le trap get vous permet d’intercepter les tentatives d’accès aux propriétés de l’objet cible. Il est souvent utilisé pour journaliser les accès ou calculer dynamiquement des propriétés en fonction des propriétés de la cible.

Exemple :


Output appears here after Run.

Ce code met en place un proxy pour journaliser les accès aux propriétés d’un objet.

  • Handler : définit un trap get pour journaliser la propriété accédée.
  • Objet cible : contient les propriétés name et age.
  • Proxy : enveloppe l’objet target avec le handler.

Lorsque proxy.name est accédé, il journalise "Getting name" et renvoie "John". C’est utile pour surveiller ou déboguer les accès aux propriétés.

Manipuler les opérations sur les objets avec les traps set et apply

Le trap set

Le trap set peut imposer des règles pour les affectations de propriétés, en s’assurant que les propriétés conservent des types spécifiques ou respectent certaines conditions.

Exemple :


Output appears here after Run.

Ce code met en place un proxy pour valider et journaliser les affectations de propriétés sur un objet.

  • Handler : définit un trap set pour vérifier la propriété age et journaliser les tentatives de modification.
  • Proxy : enveloppe l’objet target avec le handler.

Lorsque proxy.age est défini, il vérifie s’il s’agit d’un âge valide (0-150). Si ce n’est pas le cas, il journalise une erreur et lève une exception.

Le trap apply

La méthode apply dans un Proxy JavaScript intercepte les appels de fonction. Elle prend trois arguments :

  1. target : la fonction d’origine appelée.
  2. thisArg : la valeur de this à l’intérieur de la fonction.
  3. argumentsList : un tableau d’arguments passés à la fonction.

Exemple :


Output appears here after Run.

Ce code met en place un proxy pour journaliser les appels de fonction et leurs arguments.

  • Handler : définit un trap apply pour journaliser les arguments lorsque la fonction est appelée.
  • Fonction : sum additionne deux nombres.
  • Proxy : enveloppe la fonction sum avec le handler.

Dans le code fourni, le trap apply journalise les arguments puis appelle la fonction d’origine à l’aide de target.apply(thisArg, argumentsList). C’est utile pour la journalisation, le débogage ou la modification dynamique du comportement d’une fonction.

WARNING

Les proxys JavaScript sont puissants, mais utilisez-les avec discernement. En abuser peut rendre votre code plus difficile à comprendre et à maintenir. Notez que les proxys introduisent une légère surcharge de performance par rapport aux objets natifs.

API Reflect

L’API Reflect de JavaScript est un objet intégré qui fournit des méthodes pour les opérations JavaScript interceptables. Ces méthodes sont similaires à celles que l’on trouve sur des objets comme Object, Function et Array. L’objectif principal de Reflect est de rendre les opérations plus prévisibles et d’aider les développeurs à écrire un code plus propre.

Voici une explication simple de certaines méthodes clés de Reflect avec des exemples :

1. Reflect.get()

Cette méthode est utilisée pour obtenir la valeur d’une propriété d’un objet.

Exemple :


Output appears here after Run.

2. Reflect.set()

Cette méthode est utilisée pour définir la valeur d’une propriété sur un objet.

Exemple :


Output appears here after Run.

3. Reflect.has()

Cette méthode vérifie si une propriété existe dans un objet.

Exemple :


Output appears here after Run.

4. Reflect.deleteProperty()

Cette méthode supprime une propriété d’un objet.

Exemple :


Output appears here after Run.

5. Reflect.ownKeys()

Cette méthode renvoie toutes les clés de propriétés propres d’un objet.

Exemple :


Output appears here after Run.

6. Reflect.apply()

Cette méthode appelle une fonction cible avec les arguments donnés.

Exemple :


Output appears here after Run.

7. Reflect.construct()

Cette méthode est utilisée pour créer une nouvelle instance d’un objet.

Exemple :


Output appears here after Run.

Ces exemples montrent comment vous pouvez utiliser les méthodes Reflect pour effectuer des opérations courantes sur des objets de manière plus propre et plus cohérente.

Cas d’utilisation pratiques des proxys JavaScript

Exemple 1 : Initialisation automatique des propriétés

Description : Utilisez les proxys JavaScript pour initialiser automatiquement les propriétés indéfinies d’un objet. Cela peut être utile dans des situations où des objets sont remplis dynamiquement avec des données au fil du temps, comme des paramètres utilisateur ou des configurations qui ne sont pas définis au départ.


Output appears here after Run.

Ce code crée un proxy qui vérifie si une propriété existe sur un objet. Si ce n’est pas le cas, le proxy lui attribue automatiquement une valeur par défaut. Cela est utile pour éviter les erreurs dues à des propriétés manquantes.

Exemple 2 : Contrôle d’accès

Description : Les proxys peuvent imposer des autorisations de lecture ou d’écriture sur les propriétés d’un objet. Cet exemple montre un proxy qui empêche certaines propriétés d’être lues ou écrites selon des règles prédéfinies, ce qui est particulièrement utile pour gérer l’accès à des données sensibles.


Output appears here after Run.

Ce code sécurise un objet en contrôlant l’accès à ses propriétés. Il bloque la lecture de sensitiveData et empêche la modification des propriétés readOnly, ce qui aide à protéger les données.

Exemple 3 : Journalisation et débogage

Description : Les proxys peuvent être utilisés pour journaliser les interactions avec un objet, ce qui aide au débogage et à la surveillance des opérations. Cet exemple crée un proxy qui journalise tous les accès, affectations et appels de méthodes effectués sur un objet.


Output appears here after Run.

Ce code suit chaque fois que quelqu’un accède à une propriété de l’objet ou la modifie, ce qui est très utile pour comprendre ce que fait votre code et à quel moment.

Exemple 4 : Validation des données

Description : Utilisez les proxys pour valider à la volée les propriétés d’un objet. C’est particulièrement utile pour garantir l’intégrité des données lorsque des objets sont mis à jour dynamiquement dans une application.


Output appears here after Run.

Cet exemple montre comment utiliser Proxy de JavaScript pour valider et journaliser les changements de propriétés. L’objet validator vérifie si la propriété age est un nombre valide compris entre 0 et 150. Sinon, il journalise une erreur et lève une exception. Dans le cas contraire, il journalise la nouvelle valeur et met à jour la propriété. L’objet person utilise ce validateur pour gérer sa propriété age, garantissant que les âges invalides sont détectés et consignés.

Conclusion

Maîtriser les proxys JavaScript vous permet de contrôler et d’améliorer le comportement de votre code. Les proxys peuvent renforcer la sécurité, ajouter un comportement personnalisé aux classes et améliorer les outils de débogage. Ils aident à créer des applications plus dynamiques et plus sûres, ce qui conduit à un code plus propre, plus efficace et plus facile à maintenir. Ces connaissances amélioreront vos compétences en développement JavaScript et vous prépareront à relever les défis du web moderne.

Practice

What is the main functionality of JavaScript's Proxy and Reflect objects?

Trouvez-vous cela utile?

Aperçu dual-run — comparez avec les routes Symfony en production.