WeakMap (WeakMap)
«WeakMap» جایی برای نگهداری «کلید/مقدار» است؛ اما کلید حتماً «شیء (Object)» است. همچنین، «ارجاع ضعیف (Weak Reference)» دارد؛ یعنی نبودنِ ارجاع، پاکسازی خودکار را ممکن می کند.
ساخت و کار با WeakMap
کلید باید شیء باشد. سپس با set مقدار می دهی و با get می خوانی.
// 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);
زباله روبی (Garbage Collection) و ارجاع ضعیف
اگر تنها ارجاعِ یک شیء را برداری، مرورگر می تواند آن را پاک کند. سپس جفتِ آن از WeakMap حذف می شود.
let myMap2 = new WeakMap();
let person = { fname: "John", lname: "Doe" };
myMap2.set(person, "secret");
// Remove the last strong reference
person = null;
// حالا امکان پاکسازی خودکار وجود دارد.
شمارش بازدید با WeakMap
با WeakMap می توانی داده های موقتی روی اشیاء نگه داری؛ بدون جلوگیری از پاکسازی.
let logText = "";
// 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);
logText += visitor.name + ", age " + visitor.age + ", has visited " + count + " time(s).";
}
پاکسازی خودکار در عمل
اگر همه ارجاع ها را از یک بازدیدکننده برداری، نگاشتش حذف می شود.
// Example continuation idea
let somebody = { name: "Temp" };
const store = new WeakMap();
store.set(somebody, 1);
// Drop last reference
afterUse();
function afterUse() {
somebody = null;
// اکنون ورودی مربوطه می تواند پاک شود.
}
حریم خصوصی با WeakMap
WeakMap قابل پیمایش نیست. بیرون کلاس نمی توان محتوا را دید؛ فقط با شیء کلید.
// Create WeakMap
const privateStore = new WeakMap();
// Private Fields Simulation
class User {
constructor(name) {
privateStore.set(this, { secret: "hidden data" });
this.name = name;
}
getSecret() {
return privateStore.get(this).secret;
}
}
const user1 = new User("John");
let secret = user1.getSecret();
نکته: متدهای WeakMap محدودند: new WeakMap(), get, set, delete, has. اندازه و پیمایش نداریم.
گام های عملی سریع
- یک WeakMap بساز و یک شیء کلید بده.
- با set یک مقدار خصوصی ذخیره کن.
- با get مقدار را بازیابی کن.
- کلید را null کن تا پاکسازی ممکن شود.
جمع بندی سریع
- کلید در WeakMap فقط شیء است.
- ارجاع ضعیف اجازه پاکسازی می دهد.
- پیمایش و size وجود ندارد.
- برای داده های خصوصی خیلی کاربردی است.
برای ادامه مسیر، صفحه نگاشت ها (Maps) و متدهای نگاشت را ببین. همچنین مرجع نگاشت مفید است.