JavaScript WeakMap
L'objet WeakMap
Un WeakMap en JavaScript est une collection de paires clé/valeur où les clés doivent être des objets .
Un WeakMap conserve des références faibles à ses clés.
Exemple
// Créer un WeakMap
let myMap = new WeakMap();
// Créer un objet
let myObj = {fname:"John", lname:"Doe"};
// Définir une valeur dans le WeakMap
myMap.set(myObj, "player");
// Obtenir la valeur du WeakMap
let type = myMap.get(myObj); Collecte des déchets
JavaScript utilise un mécanisme de gestion de la mémoire connu sous le nom de Collecte des déchets .
Les fonctions principales sont :
- Assurer une utilisation efficace des ressources mémoire
- Récupérer la mémoire occupée par des variables qui ne sont plus utilisées
- Prévenir les fuites de mémoire
Références faibles
Contrairement à une carte normale, un WeakMap ne prévient pas ses clés d'être collectées par le ramasse-miettes.
Si une clé (un objet) n'a plus de références dans un programme, elle devient éligible à la collecte des déchets.
Lorsque la clé est collectée, sa paire clé-valeur est supprimée du WeakMap.
Exemple
let myMap = new WeakMap();
let myObj = {fname:"John", lname:"Doe"};
myMap.set(myObj, "secret");
myObj = null;
// maintenant myObj (et ses valeurs) dans myMap peuvent être collectés Les clés doivent être des objets
Les valeurs primitives ne peuvent pas être utilisées comme clés dans un WeakMap.
Les clés doivent être des objets ou des symboles non enregistrés.
Cette restriction est liée au mécanisme de collecte des déchets ; les primitives ne sont pas collectées de la même manière que les objets.
Suivi des objets
Les entrées dans un WeakMap sont faiblement conservées : si la clé de l'objet devient inaccessible, son mappage est supprimé automatiquement.
C'est parfait pour suivre des données sur des objets sans empêcher la collecte des déchets.
Suivi des visiteurs
let text = "";
// Créer un WeakMap pour stocker les comptes de visites
const visitsCount = new WeakMap();
// Créer des objets visiteurs
const John = {name:"John", age:40};
const Paul = {name:"Paul", age:41};
const Ringo = {name:"Ringo", age:42};
const George = {name:"George", age:43};
// Suivre les visites
track(Paul);
track(Ringo);
track(Paul);
track(Paul);
track(John);
// Fonction pour suivre les visiteurs
function track(visitor) {
let count = visitsCount.get(visitor) || 0;
count++;
visitsCount.set(visitor, count);
text += visitor.name + ", âge " + visitor.age + ", a visité " + count + " fois.<br>";
}
Nettoyage automatique
Si vous supprimez toutes les références à un objet visiteur :
Suivi des visiteurs :
John = null;
// L'entrée pour John est maintenant supprimée du WeakMap (persons) Non itérable
Les WeakMaps sont non énumérables .
Vous ne pouvez pas itérer sur les clés et les valeurs avec des boucles for, forEach() ou keys().
Vous ne pouvez pas accéder à la taille.
Méthodes limitées
WeakMap fournit un ensemble limité de méthodes :
| new WeakMap() | Crée un nouvel objet WeakMap |
| get(key) | Obtient la valeur pour une clé dans un WeakMap |
| set(key, value) | Définit la valeur pour une clé dans un WeakMap |
| delete(key) | Supprime un élément spécifié par une clé |
| has(key) | Renvoie vrai si une clé existe dans un WeakMap |
Données secrètes de Weak Map
Exemple
// Créer un WeakMap
const myMap = new WeakMap();
// Simulation de champs privés
class User {
constructor(name) {
myMap.set(this, {secret:"données cachées"});
this.name = name;
}
getSecret() {
return myMap.get(this).secret;
}
}
const user1 = new User("John");
secret = user1.getSecret();
Exemple expliqué
Un WeakMap ne permet pas l'itération.
Le code extérieur ne peut pas "découvrir" quels objets sont stockés à l'intérieur d'un WeakMap.
Pour obtenir le secret, vous avez besoin de la référence this qui a été utilisée dans le constructeur.
Le code externe a accès à user1 et myMap, mais pas à la référence this à l'intérieur de myMap, à moins que vous ne l'exposiez explicitement, comme via getSecret(); la valeur secrète est inaccessibile.
Confidentialité
WeakMap a été intentionnellement conçu pour la confidentialité : vous pouvez définir, obtenir, vérifier et supprimer en utilisant une clé d'objet, mais pas inspecter ce qui est à l'intérieur.
C'était un excellent outil pour simuler des propriétés privées dans les classes JavaScript (avant que les champs #privés ne soient ajoutés au langage).
En savoir plus :
Support des navigateurs
WeakMap est une fonctionnalité ES6 .
ES6 est entièrement pris en charge dans tous les navigateurs modernes depuis juin 2017 :
| Chrome 51 | Edge 15 | Firefox 54 | Safari 10 | Opera 38 |
| Mai 2016 | Avr 2017 | Juin 2017 | Sep 2016 | Juin 2016 |