Maison interface Web js tutoriel Instructions d'utilisation du proxy dans ES6

Instructions d'utilisation du proxy dans ES6

Jun 13, 2018 am 10:57 AM
es6 proxy

Cet article présente principalement les scénarios d'utilisation d'ES6 Proxy. Maintenant, je le partage avec vous et vous donne une référence.

Des fonctionnalités telles que les fonctions de flèche, la déstructuration de tableaux et les paramètres de repos dans ES6 ont été largement diffusées dès leur implémentation. Cependant, des fonctionnalités telles que Proxy sont rarement utilisées par les développeurs. à la compatibilité des navigateurs. D'autre part, afin de profiter de ces fonctionnalités, les développeurs doivent comprendre en profondeur leurs scénarios d'utilisation. Personnellement, j'aime beaucoup le proxy d'ES6 car il nous permet de contrôler l'accès externe aux objets de manière concise et facile à comprendre. Dans ce qui suit, je présenterai d'abord comment utiliser Proxy, puis expliquerai les scénarios d'utilisation de Proxy en citant des exemples spécifiques.

Proxy, comme son nom l'indique, sa fonction est très similaire au modèle de proxy dans les modèles de conception. Ce modèle est couramment utilisé sous trois aspects :

  1. Interception et surveillance. des transactions externes Accès aux objets

  2. Réduire la complexité des fonctions ou des classes

  3. Vérifier les opérations ou gérer les ressources requises avant les opérations complexes

Dans un environnement de navigateur prenant en charge Proxy, Proxy est un objet global et peut être utilisé directement. Proxy(target, handler) est un constructeur, target est l'objet proxy, handler est un objet qui déclare diverses opérations de proxy et renvoie finalement un objet proxy. Chaque fois que le monde extérieur accède aux propriétés de l'objet cible via l'objet proxy, il passera par l'objet gestionnaire. À partir de ce processus, l'objet proxy est très similaire au middleware. Alors, quelles opérations Proxy peut-il intercepter ? Les opérations les plus courantes sont obtenir (lire) et définir (modifier) ​​les propriétés des objets. Pour une liste complète des opérations interceptables, veuillez cliquer ici. De plus, l'objet Proxy fournit également une méthode de révocation pour déconnecter toutes les opérations proxy à tout moment. Avant de présenter officiellement Proxy, il est recommandé d'avoir une certaine compréhension de Reflect. Il s'agit également d'un nouvel objet global dans ES6. Pour des informations détaillées, veuillez vous référer à MDN Reflect.

Basique

const target = { 
  name: 'Billy Bob',
  age: 15
};

const handler = { 
  get(target, key, proxy) {
    const today = new Date();
    console.log(`GET request made for ${key} at ${today}`);

    return Reflect.get(target, key, proxy);
  }
};

const proxy = new Proxy(target, handler);
proxy.name;
// => "GET request made for name at Thu Jul 21 2016 15:26:20 GMT+0800 (CST)"
// => "Billy Bob"
Copier après la connexion

Dans le code ci-dessus, nous définissons d'abord un objet cible proxy, puis déclarons l'objet gestionnaire qui contient toutes les opérations proxy, puis utilisons Proxy (cible, gestionnaire) crée un proxy d'objet proxy. Après cela, tous les accès à l'attribut cible à l'aide d'un proxy seront traités par le gestionnaire.

1. Extrayez le module de vérification

Commençons par une simple vérification de type Cet exemple montre comment utiliser Proxy pour garantir l'exactitude des types de données :

let numericDataStore = { 
  count: 0,
  amount: 1234,
  total: 14
};

numericDataStore = new Proxy(numericDataStore, { 
  set(target, key, value, proxy) {
    if (typeof value !== 'number') {
      throw Error("Properties in numericDataStore can only be numbers");
    }
    return Reflect.set(target, key, value, proxy);
  }
});

// 抛出错误,因为 "foo" 不是数值
numericDataStore.count = "foo";

// 赋值成功
numericDataStore.count = 333;
Copier après la connexion

Si vous souhaitez développer directement un validateur pour toutes les propriétés d'un objet, la structure du code peut rapidement devenir gonflée. À l'aide de Proxy, vous pouvez séparer le validateur de la logique de base :

.
function createValidator(target, validator) { 
  return new Proxy(target, {
    _validator: validator,
    set(target, key, value, proxy) {
      if (target.hasOwnProperty(key)) {
        let validator = this._validator[key];
        if (!!validator(value)) {
          return Reflect.set(target, key, value, proxy);
        } else {
          throw Error(`Cannot set ${key} to ${value}. Invalid.`);
        }
      } else {
        throw Error(`${key} is not a valid property`)
      }
    }
  });
}

const personValidators = { 
  name(val) {
    return typeof val === 'string';
  },
  age(val) {
    return typeof age === 'number' && age > 18;
  }
}
class Person { 
  constructor(name, age) {
    this.name = name;
    this.age = age;
    return createValidator(this, personValidators);
  }
}

const bill = new Person('Bill', 25);

// 以下操作都会报错
bill.name = 0; 
bill.age = 'Bill'; 
bill.age = 15;
Copier après la connexion

En séparant le validateur et la logique principale, vous pouvez étendre à l'infini le contenu du validateur personValidators sans causer de dommages directs aux classes ou fonctions associées. Pour compliquer les choses, nous pouvons également utiliser Proxy pour simuler la vérification de type et vérifier si la fonction reçoit le type et le nombre de paramètres corrects :

let obj = { 
  pickyMethodOne: function(obj, str, num) { /* ... */ },
  pickyMethodTwo: function(num, obj) { /*... */ }
};

const argTypes = { 
  pickyMethodOne: ["object", "string", "number"],
  pickyMethodTwo: ["number", "object"]
};

obj = new Proxy(obj, { 
  get: function(target, key, proxy) {
    var value = target[key];
    return function(...args) {
      var checkArgs = argChecker(key, args, argTypes[key]);
      return Reflect.apply(value, target, args);
    };
  }
});

function argChecker(name, args, checkers) { 
  for (var idx = 0; idx < args.length; idx++) {
    var arg = args[idx];
    var type = checkers[idx];
    if (!arg || typeof arg !== type) {
      console.warn(`You are incorrectly implementing the signature of ${name}. Check param ${idx + 1}`);
    }
  }
}

obj.pickyMethodOne(); 
// > You are incorrectly implementing the signature of pickyMethodOne. Check param 1
// > You are incorrectly implementing the signature of pickyMethodOne. Check param 2
// > You are incorrectly implementing the signature of pickyMethodOne. Check param 3

obj.pickyMethodTwo("wopdopadoo", {}); 
// > You are incorrectly implementing the signature of pickyMethodTwo. Check param 1

// No warnings logged
obj.pickyMethodOne({}, "a little string", 123); 
obj.pickyMethodOne(123, {});
Copier après la connexion

Propriétés privées <🎜. >

En JavaScript ou dans d'autres langages, il est d'usage d'ajouter un trait de soulignement _ avant le nom de la variable pour indiquer qu'il s'agit d'une propriété privée (pas vraiment privée), mais nous ne pouvons garantir que personne n'y accédera ou ne la modifiera. Dans le code suivant, nous déclarons une apiKey privée pour faciliter les appels de méthode au sein de l'objet api, mais nous ne voulons pas pouvoir accéder à l'api depuis l'extérieur._apiKey :

var api = { 
  _apiKey: &#39;123abc456def&#39;,
  /* mock methods that use this._apiKey */
  getUsers: function(){}, 
  getUser: function(userId){}, 
  setUser: function(userId, config){}
};

// logs &#39;123abc456def&#39;;
console.log("An apiKey we want to keep private", api._apiKey);

// get and mutate _apiKeys as desired
var apiKey = api._apiKey; 
api._apiKey = &#39;987654321&#39;;
Copier après la connexion
Évidemment, il y a pas de convention contraignante. En utilisant ES6 Proxy, nous pouvons implémenter de vraies variables privées. Ce qui suit montre deux méthodes de privatisation différentes pour différentes méthodes de lecture. La première méthode consiste à utiliser set/get pour intercepter les requêtes de lecture et d'écriture et renvoyer undefined :

let api = { 
  _apiKey: &#39;123abc456def&#39;,
  getUsers: function(){ }, 
  getUser: function(userId){ }, 
  setUser: function(userId, config){ }
};

const RESTRICTED = [&#39;_apiKey&#39;];
api = new Proxy(api, { 
  get(target, key, proxy) {
    if(RESTRICTED.indexOf(key) > -1) {
      throw Error(`${key} is restricted. Please see api documentation for further info.`);
    }
    return Reflect.get(target, key, proxy);
  },
  set(target, key, value, proxy) {
    if(RESTRICTED.indexOf(key) > -1) {
      throw Error(`${key} is restricted. Please see api documentation for further info.`);
    }
    return Reflect.get(target, key, value, proxy);
  }
});

// 以下操作都会抛出错误
console.log(api._apiKey);
api._apiKey = &#39;987654321&#39;;
Copier après la connexion
La deuxième méthode consiste à utiliser has to intercept dans les opérations :

var api = { 
  _apiKey: &#39;123abc456def&#39;,
  getUsers: function(){ }, 
  getUser: function(userId){ }, 
  setUser: function(userId, config){ }
};

const RESTRICTED = [&#39;_apiKey&#39;];
api = new Proxy(api, { 
  has(target, key) {
    return (RESTRICTED.indexOf(key) > -1) ?
      false :
      Reflect.has(target, key);
  }
});

// these log false, and `for in` iterators will ignore _apiKey
console.log("_apiKey" in api);

for (var key in api) { 
  if (api.hasOwnProperty(key) && key === "_apiKey") {
    console.log("This will never be logged because the proxy obscures _apiKey...")
  }
}
Copier après la connexion

3 . Journal d'accès

Pour les propriétés ou interfaces qui sont fréquemment appelées, qui s'exécutent lentement ou qui occupent beaucoup de ressources de l'environnement d'exécution, les développeurs voudront enregistrer leur utilisation ou leurs performances à ce moment-là. , Le proxy peut être utilisé Agissant comme middleware, vous pouvez facilement implémenter la fonction de journalisation :

let api = { 
  _apiKey: &#39;123abc456def&#39;,
  getUsers: function() { /* ... */ },
  getUser: function(userId) { /* ... */ },
  setUser: function(userId, config) { /* ... */ }
};

function logMethodAsync(timestamp, method) { 
  setTimeout(function() {
    console.log(`${timestamp} - Logging ${method} request asynchronously.`);
  }, 0)
}

api = new Proxy(api, { 
  get: function(target, key, proxy) {
    var value = target[key];
    return function(...arguments) {
      logMethodAsync(new Date(), key);
      return Reflect.apply(value, target, arguments);
    };
  }
});

api.getUsers();
Copier après la connexion

4. Alerte précoce et interception

Supposons que vous ne le vouliez pas. d'autres développeurs pour supprimer l'attribut noDelete, et vous souhaitez également faire savoir au développeur qui appelle oldMethod que cette méthode a été abandonnée, ou dire au développeur de ne pas modifier l'attribut doNotChange, vous pouvez alors utiliser Proxy pour y parvenir :

let dataStore = { 
  noDelete: 1235,
  oldMethod: function() {/*...*/ },
  doNotChange: "tried and true"
};

const NODELETE = [&#39;noDelete&#39;]; 
const NOCHANGE = [&#39;doNotChange&#39;];
const DEPRECATED = [&#39;oldMethod&#39;]; 

dataStore = new Proxy(dataStore, { 
  set(target, key, value, proxy) {
    if (NOCHANGE.includes(key)) {
      throw Error(`Error! ${key} is immutable.`);
    }
    return Reflect.set(target, key, value, proxy);
  },
  deleteProperty(target, key) {
    if (NODELETE.includes(key)) {
      throw Error(`Error! ${key} cannot be deleted.`);
    }
    return Reflect.deleteProperty(target, key);

  },
  get(target, key, proxy) {
    if (DEPRECATED.includes(key)) {
      console.warn(`Warning! ${key} is deprecated.`);
    }
    var val = target[key];

    return typeof val === &#39;function&#39; ?
      function(...args) {
        Reflect.apply(target[key], target, args);
      } :
      val;
  }
});

// these will throw errors or log warnings, respectively
dataStore.doNotChange = "foo"; 
delete dataStore.noDelete; 
dataStore.oldMethod();
Copier après la connexion

5. Opération de filtrage

Certaines opérations occuperont beaucoup de ressources, comme le transfert de fichiers volumineux à ce moment-là, si le fichier est déjà envoyé en morceaux. , il n'est pas nécessaire de répondre aux nouvelles demandes (non absolues). Utilisez Proxy pour détecter les caractéristiques de la demande et filtrer celles qui ne nécessitent pas de réponse et celles qui nécessitent une réponse en fonction des caractéristiques. Le code suivant montre simplement comment filtrer les fonctionnalités. Ce n'est pas un code complet, je pense que tout le monde en comprendra la beauté :

let obj = { 
  getGiantFile: function(fileId) {/*...*/ }
};

obj = new Proxy(obj, { 
  get(target, key, proxy) {
    return function(...args) {
      const id = args[0];
      let isEnroute = checkEnroute(id);
      let isDownloading = checkStatus(id);   
      let cached = getCached(id);

      if (isEnroute || isDownloading) {
        return false;
      }
      if (cached) {
        return cached;
      }
      return Reflect.apply(target[key], target, args);
    }
  }
});
Copier après la connexion

6. 🎜> Proxy prend en charge l'annulation du proxy de la cible à tout moment. Cette opération est souvent utilisée pour fermer complètement l'accès aux données ou aux interfaces. Dans l'exemple suivant, nous utilisons la méthode Proxy.revocable pour créer un objet proxy pour un proxy révocable :

Decorator

let sensitiveData = { username: &#39;devbryce&#39; };
const {sensitiveData, revokeAccess} = Proxy.revocable(sensitiveData, handler);
function handleSuspectedHack(){ 
  revokeAccess();
}

// logs &#39;devbryce&#39;
console.log(sensitiveData.username);
handleSuspectedHack();
// TypeError: Revoked
console.log(sensitiveData.username);
Copier après la connexion

Le Decorator implémenté dans ES7 est équivalent au modèle de décorateur dans le modèle de conception. Si nous distinguons simplement les scénarios d'utilisation de Proxy et Decorator, cela peut être résumé comme suit : La fonction principale de Proxy est de contrôler l'accès externe à l'intérieur du proxy, et la fonction principale de Decorator est d'améliorer la fonction du proxy. décorateur. Tant que leurs scénarios d'utilisation principaux sont distingués, des fonctions telles que les journaux d'accès, bien que cet article utilise Proxy pour les implémenter, peuvent également être implémentées à l'aide de Decorator. Les développeurs peuvent les implémenter gratuitement en fonction des besoins du projet, des spécifications de l'équipe et de leurs propres préférences. choix.

J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir.

Articles connexes :

Comment introduire des fichiers CSS publics via Vue

Quelles sont les méthodes d'utilisation d'ajax dans Vue ?

Comment implémenter un slot de distribution de données dans vue.js

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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 !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Analyse et optimisation de la configuration de Nginx Proxy Manager Analyse et optimisation de la configuration de Nginx Proxy Manager Sep 26, 2023 am 09:24 AM

Présentation de l'analyse et de l'optimisation de la configuration de NginxProxyManager : NginxProxyManager est un outil de gestion de proxy inverse basé sur Nginx, qui peut nous aider à configurer et à gérer facilement des serveurs proxy inverse. Dans le processus d'utilisation de NginxProxyManager, nous pouvons améliorer les performances et la sécurité du serveur en analysant et en optimisant sa configuration. Analyse de la configuration : emplacement et structure du fichier de configuration : NginxProxyManag

L'async est-il pour es6 ou es7 ? L'async est-il pour es6 ou es7 ? Jan 29, 2023 pm 05:36 PM

async est es7. async et wait sont de nouveaux ajouts à ES7 et sont des solutions pour les opérations asynchrones ; async/await peut être considéré comme un sucre syntaxique pour les modules co et les fonctions de générateur, résolvant le code asynchrone js avec une sémantique plus claire. Comme son nom l'indique, async signifie « asynchrone ». Async est utilisé pour déclarer qu'une fonction est asynchrone ; il existe une règle stricte entre async et wait. Les deux sont inséparables l'un de l'autre et wait ne peut être écrit que dans des fonctions asynchrones.

Comment configurer et utiliser le protocole proxy dans nginx Comment configurer et utiliser le protocole proxy dans nginx May 18, 2023 am 08:47 AM

Lorsque le protocole proxy est utilisé dans nginx, nous savons que nginx est un serveur Web et un serveur proxy. Il fonctionne généralement derrière un serveur proxy ou un logiciel d'équilibrage de charge (Haproxy, Amazon Elastic LoadBalancer (ELB)). puis à nginx Effectuer un véritable accès au Web. Parce qu'il a traversé plusieurs couches de logiciel, certaines informations client telles que l'adresse IP, le numéro de port, etc. peuvent être masquées, ce qui est préjudiciable à notre analyse des problèmes et à nos statistiques de données, car pour nginx. , Nous voulons pouvoir avoir de vrais clients

Stratégies de déploiement de conteneurs et de microservices sous Nginx Proxy Manager Stratégies de déploiement de conteneurs et de microservices sous Nginx Proxy Manager Sep 27, 2023 pm 01:06 PM

La stratégie de déploiement de conteneurs et de microservices sous NginxProxyManager nécessite des exemples de code spécifiques. Résumé : Avec la popularité de l'architecture des microservices, la technologie de conteneurisation est devenue une partie importante du développement logiciel moderne. Dans l'architecture des microservices, NginxProxyManager joue un rôle très important, utilisé pour gérer et proxy le trafic des microservices. Cet article explique comment utiliser NginxProxyManager pour déployer et gérer des microservices conteneurisés et fournit des exemples de code pertinents.

Comment utiliser Nginx Proxy Manager pour réaliser l'équilibrage de charge de plusieurs serveurs Comment utiliser Nginx Proxy Manager pour réaliser l'équilibrage de charge de plusieurs serveurs Sep 27, 2023 pm 09:42 PM

Comment utiliser NginxProxyManager pour réaliser l'équilibrage de charge de plusieurs serveurs. NginxProxyManager est un outil de gestion de serveur proxy développé sur la base de Nginx. Il fournit une interface Web simple et facile à utiliser qui peut facilement configurer et gérer les serveurs proxy Nginx. Dans les applications pratiques, nous devons souvent distribuer les requêtes sur plusieurs serveurs pour réaliser un équilibrage de charge et améliorer les performances et la disponibilité du système. Cet article expliquera comment utiliser NginxProx

Tutoriel Nginx Proxy Manager : Guide de démarrage rapide Tutoriel Nginx Proxy Manager : Guide de démarrage rapide Sep 27, 2023 pm 05:39 PM

Tutoriel NginxProxyManager : Guide de démarrage rapide, exemples de code spécifiques requis Introduction : Avec le développement de la technologie réseau, les serveurs proxy font désormais partie de notre utilisation quotidienne d'Internet. NginxProxyManager est une plateforme de gestion de serveur proxy basée sur Nginx, qui peut nous aider à établir et gérer rapidement des serveurs proxy. Cet article vous présentera le guide de démarrage rapide de NginxProxyManager, ainsi que quelques exemples de code spécifiques. un

Pourquoi le mini-programme doit-il convertir es6 en es5 ? Pourquoi le mini-programme doit-il convertir es6 en es5 ? Nov 21, 2022 pm 06:15 PM

Pour la compatibilité du navigateur. En tant que nouvelle spécification pour JS, ES6 ajoute de nombreuses nouvelles syntaxes et API. Cependant, les navigateurs modernes ne prennent pas en charge les nouvelles fonctionnalités d'ES6, le code ES6 doit donc être converti en code ES5. Dans les outils de développement Web WeChat, babel est utilisé par défaut pour convertir le code de syntaxe ES6 du développeur en code ES5 bien pris en charge par les trois terminaux, aidant les développeurs à résoudre les problèmes de développement causés par différents environnements uniquement dans le projet. Il suffit de configurer et de vérifier le ; Option "ES6 à ES5".

Comment trouver différents éléments dans deux tableaux dans Es6 Comment trouver différents éléments dans deux tableaux dans Es6 Nov 01, 2022 pm 06:07 PM

Étapes : 1. Convertissez respectivement les deux tableaux en types d'ensemble, avec la syntaxe "newA=new Set(a); newB=new Set(b);" 2. Utilisez has() et filter() pour trouver l'ensemble de différences. , avec la syntaxe " new Set([...newA].filter(x =>!newB.has(x)))", les éléments de l'ensemble de différences seront inclus dans une collection d'ensembles et renvoyés 3. Utilisez Array. from pour convertir l'ensemble en tableau Tapez, syntaxe "Array.from(collection)".

See all articles