WeakMap
Mapa z obiektami jako kluczami, która nie zatrzymuje ich w pamięci: wpis znika razem z nieużywanym obiektem.
- Zwraca
- Nowy obiekt
WeakMap.
Przykład
#const visits = new WeakMap()
function trackVisit(user) {
visits.set(user, (visits.get(user) ?? 0) + 1)
return visits.get(user)
}
const ania = { name: 'Ania' }
trackVisit(ania)
console.log(trackVisit(ania))
console.log(visits.has({ name: 'Ania' }))Definicja i zastosowanie
#WeakMap działa podobnie do Map, ale służy do przypisywania danych do obiektów: kluczami są obiekty, a próba użycia napisu czy liczby kończy się błędem TypeError. Mapa trzyma klucze „słabo”: gdy w programie nie ma już żadnego innego odwołania do obiektu użytego jako klucz, silnik JavaScript może usunąć go z pamięci razem z przypisaną wartością.
Dzięki temu WeakMap dobrze nadaje się do dołączania dodatkowych danych do obiektów, których nie kontrolujesz, na przykład elementów DOM albo obiektów z biblioteki, bez ryzyka wycieku pamięci. Gdy element zostanie usunięty ze strony i zapomniany, jego dane też znikną.
WeakMap ma tylko cztery metody: set(), get(), has() i delete(). Nie ma size, clear() ani sposobu na przejście po wpisach, bo jej zawartość może się zmienić w każdej chwili w wyniku sprzątania pamięci. Jeśli potrzebujesz listy wszystkich wpisów, użyj zwykłej Map.
Składnia
#new WeakMap()
new WeakMap(iterable)
weakMap.set(key, value)
weakMap.get(key)
weakMap.has(key)
weakMap.delete(key)Parametry
#iterable
opcjonalny
Tablica par[obiekt, wartość], którymi mapa zostanie wypełniona na start.
Więcej przykładów
#const cache = new WeakMap()
try {
cache.set('Ania', 1)
} catch (error) {
console.log(error.name)
}
console.log(cache)const passwords = new WeakMap()
class Account {
constructor(login, password) {
this.login = login
passwords.set(this, password)
}
checkPassword(attempt) {
return passwords.get(this) === attempt
}
}
const account = new Account('ania', 'tajne123')
console.log(account)
console.log(account.checkPassword('tajne123'))Hasło nie jest właściwością obiektu, więc nie widać go w konsoli ani w Object.keys(). W nowych klasach ten sam efekt daje prywatne pole #password.
Obsługa przeglądarek
#Szeroko dostępne
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Używaj
WeakMapdo pamięci podręcznej i danych przypiętych do obiektów, które mogą zniknąć, np. elementów DOM. - W nowych klasach do ukrywania danych wygodniejsze są pola prywatne
#pole. - Jeśli potrzebujesz
size, listy kluczy albo pętli po wpisach, wybierz zwykłąMap.
Powiązane hasła
#- MapKolekcja par klucz i wartość, w której kluczem może być dowolna wartość, a kolejność dodawania jest zachowana.
- SetKolekcja unikalnych wartości: każda wartość może wystąpić w zbiorze tylko raz.
- classDefiniuje klasę, czyli szablon do tworzenia obiektów z tymi samymi polami i metodami.
- Object.create()Tworzy nowy obiekt z podanym prototypem.
- WeakSetZbiór obiektów, który nie zatrzymuje ich w pamięci. Służy do oznaczania obiektów, np. już obsłużonych.
Widzisz błąd albo brakuje przykładu? Napisz do nas.