JS WeakMap
WeakMap obyekti
JavaScript WeakMap — bu kalit/qiymat juftliklari to‘plami bo‘lib, unda kalitlar faqat obyekt bo‘lishi shart.
WeakMap o‘z kalitlariga zaif havolalarni (weak references) saqlaydi.
Misol
// Create a WeakMap
let myMap = new WeakMap();
// Create an Object
let myObj = {fname:"John", lname:"Doe"};
// Set a WeakMap value
myMap.set(myObj, "player");
// Get the WeakMap value
let type = myMap.get(myObj);
O‘zingiz sinab ko‘ring »
Axlat yig‘ish (garbage collection)
JavaScript Garbage Collection (axlat yig‘ish) deb nomlanuvchi xotirani boshqarish mexanizmidan foydalanadi.
Asosiy funksiyalari quyidagilardir:
- Xotira resurslaridan samarali foydalanishni ta’minlash
- Foydalanilmayotgan o‘zgaruvchilar egallagan xotirani tiklang
- Preventing memory leaks
Kuchsiz havolalar
Oddiy Map’dan farqli o‘laroq, WeakMap o‘z kalitlarini axlat yig‘ishga to‘sqinlik qilmaydi.
Agar dasturda kalitga (obyektga) hech qanday havola qolmasa, u axlat yig‘ish (garbage collection) uchun yaroqli bo‘lib qoladi.
Kalit axlat yig‘ilganda, uning kalit-qiymat juftligi WeakMap-dan o‘chiriladi.
Misol
let myMap = new WeakMap();
let myObj = {fname:"John", lname:"Doe"};
myMap.set(myObj, "secret");
myObj = null;
// now myObj (and its values) in myMap can be garbage collected
Kalitlar obyekt bo‘lishi kerak
WeakMap’da primitiv qiymatlarni kalit sifatida ishlatib bo‘lmaydi.
Kalitlar obyektlar yoki ro‘yxatdan o‘tkazilmagan Symbol’lar bo‘lishi shart.
Ushbu cheklov axlat yig‘ish mexanizmi bilan bog‘liq; ibtidoiy narsalar obyektlar bilan bir xil tarzda yig‘ilgan axlat emas.
Obyektlarni kuzatish
WeakMap-dagi yozuvlar zaif saqlanadi: agar obyekt kalitiga kirish imkoni bo‘lmasa, uning Map’si avtomatik ravishda o‘chiriladi.
Bu axlat yig‘ishning oldini olmasdan obyektlar haqidagi ma’lumotlarni kuzatish uchun juda mos keladi.
Tashrif buyuruvchilarni kuzatish
let text = "";
// Create a WeakMap to store visit counts
const visitsCount = new WeakMap();
// Create Visitor Objects
const John = {name:"John", age:40};
const Paul = {name:"Paul", age:41};
const Ringo = {name:"Ringo", age:42};
const George = {name:"George", age:43};
// Track visits
track(Paul);
track(Ringo);
track(Paul);
track(Paul);
track(John);
// Function to track visitors
function track(visitor) {
let count = visitsCount.get(visitor) || 0;
count++;
visitsCount.set(visitor, count);
text += visitor.name + ", age " + visitor.age + ", has visited " + count + " time(s).<br>";
}
O‘zingiz sinab ko‘ring »
Avtomatik tozalash
Agar tashrif buyuruvchi obyektga barcha havolalarni olib tashlasangiz:
Tashrif buyuruvchilarni kuzatish:
John = null;
// The entry for John is now removed from the WeakMap (persons)
Iteratsiya qilinmaydi
WeakMap’lar sanab o‘tilmaydi (not enumerable).
Kalitlar va qiymatlar bo‘ylab for sikllari, forEach() yoki keys() yordamida iteratsiya qila olmaysiz.
O‘lchamni (size) olib bo‘lmaydi.
Cheklangan metodlar
WeakMap cheklangan metodlar to‘plamini taqdim etadi:
| new WeakMap() | Yangi WeakMap obyektini yaratadi |
| get(key) | WeakMap-dagi kalit uchun qiymatni oladi |
| set(key, value) | WeakMap-dagi kalit uchun qiymatni o‘rnatadi |
| delete(key) | Kalit bilan belgilangan elementni olib tashlaydi |
| has(key) | Kalit WeakMap’da mavjud bo‘lsa, true qaytaradi |
WeakMap yordamida maxfiy ma’lumotlar
Misol
// Create WeakMap
const myMap = new WeakMap();
// Private Fields Simulation
class User {
constructor(name) {
myMap.set(this, {secret:"hidden data"});
this.name = name;
}
getSecret() {
return myMap.get(this).secret;
}
}
const user1 = new User("John");
secret = user1.getSecret();
O‘zingiz sinab ko‘ring »
Misol tahlili
WeakMap iteratsiyaga ruxsat bermaydi.
Tashqi kod WeakMap ichida qanday obyektlar saqlanganligini "kashf eta olmaydi".
Sirni olish uchun sizga konstruktorda ishlatilgan bu havola kerak.
Tashqi kod user1 va myMap’ga murojaat qila oladi, lekin myMap ichidagi ushbu havolaga emas; agar uni aniq ochib bermasangiz (masalan, getSecret() orqali), maxfiy qiymatga yetib bo‘lmaydi.
Privacy
WeakMap qasddan maxfiylik uchun ishlab chiqilgan: siz obyekt kaliti yordamida sozlashingiz, olishingiz, ega bo‘lishingiz va o‘chirishingiz mumkin, lekin ichidagi narsalarni tekshirmaysiz.
Bu JavaScript sinflarida shaxsiy xususiyatlarni simulyatsiya qilish uchun ajoyib vosita edi (tilga #private maydonlari qo‘shilishidan oldin).
Batafsil bilib oling:
Brauzerlarda qo‘llab-quvvatlash
WeakMap — ES6 imkoniyati.
ES6 2017 yil iyun oyidan boshlab barcha zamonaviy brauzerlarda to‘liq qo‘llab-quvvatlanadi:
| Chrome 51 |
Edge 15 |
Firefox 54 |
Safari 10 |
Opera 38 |
| May 2016 | Apr 2017 | Jun 2017 | Sep 2016 | Jun 2016 |
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
