JS WeakMap

ULASHISH

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).



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!