Modèle de conception de proxy
Dans mes blogs précédents, j'ai exploré divers modèles de conception créative qui traitent des mécanismes de création d'objets. Il est maintenant temps de plonger dans les modèles de conception structurelle, qui se concentrent sur la façon dont les objets et les classes sont composés pour former des structures plus grandes tout en les gardant flexibles et efficaces. Commençons par le modèle de conception de proxy
Modèle de conception de proxy en JavaScript
Le modèle de conception Proxy est un modèle de conception structurel qui fournit un objet représentant un autre objet. Il agit comme un intermédiaire qui contrôle l'accès à l'objet réel, en ajoutant des comportements supplémentaires tels qu'une initialisation paresseuse, une journalisation, un contrôle d'accès ou une mise en cache, sans modifier le code de l'objet d'origine.
En JavaScript, les proxys sont des fonctionnalités intégrées fournies par l'objet Proxy, vous permettant de définir un comportement personnalisé pour les opérations fondamentales telles que l'accès aux propriétés, l'affectation, l'invocation de fonctions, etc.
Quand avons-nous besoin du modèle de proxy ?
Le modèle Proxy est particulièrement utile lorsque :
- Initialisation paresseuse : Vous souhaitez retarder la création d'un objet gourmand en ressources jusqu'à ce qu'il soit nécessaire.
- Contrôle d'accès : Vous devez contrôler l'accès à un objet, par exemple, pour restreindre les accès non autorisés ou pour limiter les opérations en fonction de conditions.
- Journalisation : Vous souhaitez enregistrer des actions sur un objet (par exemple, accès à une propriété ou appels de méthode).
- Mise en cache : Vous souhaitez mettre en cache le résultat d'opérations coûteuses pour éviter les calculs redondants.
Composants du modèle de proxy
- Sujet : L'interface qui définit les opérations communes à la fois pour l'objet réel et le proxy.
- RealSubject : L'objet réel qui effectue le vrai travail.
- Proxy : L'intermédiaire qui contrôle l'accès au RealSubject.
Analogie:
Imaginez que vous ayez un grand tableau que vous souhaitez montrer à vos invités, mais qu'il faut beaucoup de temps pour le sortir d'un débarras (car il est lourd et prend du temps à transporter). Au lieu d'attendre cela à chaque fois, vous décidez d'utiliser une petite image de carte postale du tableau pour leur montrer rapidement pendant qu'ils attendent que le tableau lui-même soit récupéré.
Dans cette analogie :
- Le grand tableau est l'objet réel (comme une image qui met du temps à se charger).
- La carte postale est le proxy (un substitut léger qui intervient jusqu'à ce que l'objet réel soit prêt).
- Une fois le vrai tableau prêt, vous montrez le véritable à vos invités.
Analogie du monde réel :
Considérez un agent immobilier comme un mandataire. Lorsque vous souhaitez acheter une maison, vous ne visitez pas immédiatement chaque maison (chargement de l’objet réel). Au lieu de cela, l’agent immobilier (mandataire) vous montre d’abord des photos et des descriptions. Ce n'est que lorsque vous êtes prêt à acheter (c'est-à-dire lorsque vous appelez display()) que l'agent organise une visite à domicile (charge l'objet réel).
Exemple concret : chargement d'images (proxy virtuel)
Prenons l'exemple du chargement d'une image dans une application web où l'on souhaite retarder le chargement de l'image jusqu'à ce que l'utilisateur le demande (chargement paresseux). Un proxy peut servir d'espace réservé jusqu'à ce que l'image réelle soit chargée.
Voici comment implémenter le modèle de conception Proxy en JavaScript.
Exemple : proxy pour le chargement d'images
// Step 1: The real object class RealImage { constructor(filename) { this.filename = filename; this.loadImageFromDisk(); } loadImageFromDisk() { console.log(`Loading ${this.filename} from disk...`); } display() { console.log(`Displaying ${this.filename}`); } } // Step 2: The proxy object class ProxyImage { constructor(filename) { this.realImage = null; // no real image yet this.filename = filename; } display() { if (this.realImage === null) { // load the real image only when needed this.realImage = new RealImage(this.filename); } this.realImage.display(); // display the real image } } // Step 3: Using the proxy to display the image const image = new ProxyImage("photo.jpg"); image.display(); // Loads and displays the image image.display(); // Just displays the image (already loaded)
Explication :
1). La vraie image :
- La classe RealImage représente l'image réelle.
- Il prend un nom de fichier en entrée et simule le processus fastidieux de chargement de l'image à partir du disque (indiqué par la méthode loadImageFromDisk).
- Une fois chargée, la méthode d'affichage est utilisée pour afficher l'image.
2). L'image proxy :
- La classe ProxyImage agit comme un remplaçant pour la RealImage. Il ne charge pas immédiatement l’image réelle.
- Il contient une référence à l’image réelle (mais au départ c’est nul car l’image réelle n’a pas encore été chargée).
- Lorsque vous appelez la méthode d'affichage sur le proxy, elle vérifie si l'image réelle a été chargée. Sinon, il le charge d'abord, puis l'affiche.
3). Utilisation :
- Lorsque nous créons une instance de ProxyImage, l'image réelle n'est pas encore chargée (car elle consomme beaucoup de ressources).
- La première fois que displayest appelé, le proxy charge l'image (à l'aide de la classe RealImage) puis l'affiche.
- La deuxième fois que l'affichage est appelé, l'image réelle a déjà été chargée, il affiche donc uniquement l'image sans la charger à nouveau.
L'objet Proxy intégré
Le proxy ES6 se compose d'un constructeur de proxy qui accepte une cible et un gestionnaire comme arguments
const proxy = new Proxy(target, handler)
Ici, target représente l'objet sur lequel le proxy est appliqué, tandis que handler est un objet spécial qui définit le comportement du proxy.
L'objet gestionnaire contient une série de méthodes facultatives avec des noms prédéfinis appelées méthodes trap (par exemple apply,get,set et has) qui sont automatiquement appelées lorsque les opérations correspondantes sont effectuées sur l'instance proxy.
Comprenons cela en implémentant la calculatrice à l'aide du proxy intégré
// Step 1: The real object class RealImage { constructor(filename) { this.filename = filename; this.loadImageFromDisk(); } loadImageFromDisk() { console.log(`Loading ${this.filename} from disk...`); } display() { console.log(`Displaying ${this.filename}`); } } // Step 2: The proxy object class ProxyImage { constructor(filename) { this.realImage = null; // no real image yet this.filename = filename; } display() { if (this.realImage === null) { // load the real image only when needed this.realImage = new RealImage(this.filename); } this.realImage.display(); // display the real image } } // Step 3: Using the proxy to display the image const image = new ProxyImage("photo.jpg"); image.display(); // Loads and displays the image image.display(); // Just displays the image (already loaded)
La meilleure partie en utilisant le proxy de cette façon :
- L'objet proxy hérite du prototype de la classe Calculatrice d'origine.
- Les mutations sont évitées grâce au piège posé par le proxy.
Explication du Code
1). Héritage des prototypes :
- Le proxy n'interfère pas avec le prototype original de la classe **Calculator **.
- ceci est confirmé en vérifiant si proxyedCalculator.proto === Calculator.prototype. Le résultat sera vrai.
2). Gestion des getOperations :
- Le piège get intercepte l'accès aux propriétés sur l'objet proxy.
- Nous utilisons Reflect.get pour accéder en toute sécurité aux propriétés et méthodes de l'objet d'origine.
3). Prévenir les mutations :
Le piège set génère une erreur chaque fois qu'il y a une tentative de modification d'une propriété sur l'objet cible. Cela garantit l'immuabilité.
4). Utilisation de méthodes prototypes via le proxy :
Le proxy permet d'accéder à des méthodes telles que l'addition, la soustraction, la multiplication et la division, qui sont toutes définies sur le prototype de l'objet d'origine.
Les points clés à observer ici sont :
- Préserve l'héritage du prototype : Le proxy conserve l'accès à toutes les méthodes du prototype, ce qui le fait se comporter comme la calculatrice d'origine.
- Empêche la mutation : Le piège défini garantit que l'état interne de l'objet calculatrice ne peut pas être modifié de manière inattendue.
- Accès sécurisé aux propriétés et aux méthodes : Le piège get garantit que seules les propriétés valides sont accessibles, améliorant ainsi la robustesse.
Si vous êtes arrivé jusqu'ici, n'oubliez pas d'aimer ❤️ et de laisser un commentaire ci-dessous si vous avez des questions ou des idées. Vos commentaires comptent énormément pour moi et j'aimerais avoir de vos nouvelles !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il existe trois façons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la chaîne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

Dans JavaScript, vérifiez si un tableau contient une certaine valeur. La méthode la plus courante est Inclut (), qui renvoie une valeur booléenne et la syntaxe est Array.Cuecludes (ValueToFind), par exemple les fruits.Cuels («banane») Renvoie vrai; S'il doit être compatible avec l'ancien environnement, utilisez l'indexof (), comme nombres.indexof (20)! == - 1 Renvoie True; Pour les objets ou les données complexes, une méthode () doit être utilisée pour une comparaison approfondie, telles que les utilisateurs.Some (user => user.id === 1) renvoie true.

La portée de JavaScript détermine la portée d'accessibilité des variables, qui sont divisées en étendue globale, fonction et au niveau du bloc; Le contexte détermine la direction de cela et dépend de la méthode d'appel de fonction. 1. Les étendues incluent la portée globale (accessible n'importe où), la portée de la fonction (valide uniquement dans la fonction) et la portée au niveau du bloc (LET et const sont valides dans {}). 2. Le contexte d'exécution contient l'objet variable, la chaîne de portée et les valeurs de cela. Cela pointe vers global ou non défini dans la fonction ordinaire, l'appel de méthode pointe vers l'objet d'appel, le constructeur pointe vers le nouvel objet, et peut également être explicitement spécifié par appel / application / liaison. 3. La fermeture fait référence aux fonctions accédant et en se souvenant des variables de portée externes. Ils sont souvent utilisés pour l'encapsulation et le cache, mais peuvent provoquer

Pour obtenir la valeur de la boîte d'entrée HTML, le noyau consiste à trouver l'élément correspondant via l'opération DOM et à lire l'attribut de valeur. 1. Utilisez Document.GetElementByid pour être le moyen le plus direct. Après avoir ajouté un ID à l'entrée, vous pouvez obtenir l'élément et lire la valeur via cette méthode; 2. Utilisez QueySelector pour être plus flexible, et vous pouvez sélectionner des éléments en fonction d'attributs tels que le nom, la classe, le type, etc.; 3. Vous pouvez ajouter des auditeurs d'événements d'entrée ou de modification pour atteindre des fonctions interactives, telles que l'obtention du contenu d'entrée en temps réel; 4. Faites attention au synchronisation d'exécution du script, aux erreurs d'orthographe et au jugement nul, et assurez-vous que l'élément existe avant d'accéder à la valeur.

Il existe deux méthodes de base pour obtenir la valeur du bouton radio sélectionné. 1. Utilisez QuerySelector pour obtenir directement l'élément sélectionné, et utilisez l'entrée [name = "Votre nom-radio"]: Sélecteur vérifié pour obtenir l'élément sélectionné et lire son attribut de valeur. Il convient aux navigateurs modernes et a un code concis; 2. Utilisez Document.PetelementsByName pour traverser et trouver la première radio vérifiée via la boucle Nodelist et obtenir sa valeur, qui convient aux scénarios compatibles avec les anciens navigateurs ou nécessitent un contrôle manuel du processus; De plus, vous devez faire attention à l'orthographe de l'attribut de nom, à la gestion des situations non sélectionnées et à un chargement dynamique du contenu

Les chaînes de modèle sont une fonctionnalité introduite dans JavaScriptes6, qui enveloppe le contenu avec des backticks et prend en charge l'interpolation variable et les chaînes multiplices. 1. Utilisez des backtticks pour définir des chaînes telles que ce point de vue en ligne; 2. Insérer des variables ou des expressions via $ {} Syntaxe tels que IAM $ {Age} Yearsold.; 3. Soutenez naturellement le texte multi-lignes sans ajouter manuellement Newlines. Les scénarios courants incluent la génération de contenu HTML dynamiquement, la sortie de chaîne multi-lignes et les coutures logiques conditionnelles simplifiées. Les notes incluent éviter les attaques d'injection, l'utilisation avancée des modèles de balises et garder la logique simple.

Pour utiliser JavaScript pour créer un sandbox sable sécurisé iframe, utilisez d'abord l'attribut de bac à sable de HTML pour limiter le comportement IFRAME, tel que l'interdiction de l'exécution du script, des fenêtres contextuelles et de la soumission de formulaire; Deuxièmement, en ajoutant des jetons spécifiques tels que des scénaristes pour assouplir les autorisations au besoin; Combinez ensuite PostMessage () pour obtenir une communication inter-domaine sécurisée, tout en vérifiant strictement les sources et les données de messages; Enfin, évitez les erreurs de configuration courantes, telles que ne pas vérifier la source, ne pas configurer CSP, etc., et effectuer des tests de sécurité avant de se rendre en ligne.
