この単純な機能ベースの使用例/WeakMaps の例があります。
ユーザーのコレクションを管理する
、、、および呼び出されたメソッドUser
を含むオブジェクトのプロパティから始めました。このメソッドは、他のプロパティの人間が読める要約を出力します。fullname
username
age
gender
print
/**
Basic User Object with common properties.
*/
function User(username, fullname, age, gender) {
this.username = username;
this.fullname = fullname;
this.age = age;
this.gender = gender;
this.print = () => console.log(`${this.fullname} is a ${age} year old ${gender}`);
}
users
次に、 をキーとする複数のユーザーのコレクションを保持するために呼び出される Map を追加しましたusername
。
/**
Collection of Users, keyed by username.
*/
var users = new Map();
コレクションの追加には、ユーザーを追加、取得、削除するためのヘルパー関数と、完全を期すためにすべてのユーザーを出力するための関数も必要でした。
/**
Creates an User Object and adds it to the users Collection.
*/
var addUser = (username, fullname, age, gender) => {
let an_user = new User(username, fullname, age, gender);
users.set(username, an_user);
}
/**
Returns an User Object associated with the given username in the Collection.
*/
var getUser = (username) => {
return users.get(username);
}
/**
Deletes an User Object associated with the given username in the Collection.
*/
var deleteUser = (username) => {
users.delete(username);
}
/**
Prints summary of all the User Objects in the Collection.
*/
var printUsers = () => {
users.forEach((user) => {
user.print();
});
}
上記のすべてのコードをNodeJSusers
で実行すると、プロセス全体で Mapのみがユーザー オブジェクトへの参照を持ちます。個々のユーザー オブジェクトへのその他の参照はありません。
例として、このコードをインタラクティブな NodeJS シェルで実行して、4 人のユーザーを追加して出力します。

既存のコードを変更せずにユーザーに情報を追加
ここで、各ユーザーのソーシャル メディア プラットフォーム (SMP) リンクをユーザー オブジェクトと共に追跡する必要がある新しい機能が必要であるとします。
ここで重要なのは、既存のコードへの介入を最小限に抑えてこの機能を実装する必要があることです。
これは、次の方法で WeakMaps で可能です。
Twitter、Facebook、LinkedIn 用に 3 つの個別の WeakMap を追加します。
/*
WeakMaps for Social Media Platforms (SMPs).
Could be replaced by a single Map which can grow
dynamically based on different SMP names . . . anyway...
*/
var sm_platform_twitter = new WeakMap();
var sm_platform_facebook = new WeakMap();
var sm_platform_linkedin = new WeakMap();
getSMPWeakMap
指定された SMP 名に関連付けられた WeakMap を返すだけのヘルパー関数が追加されました。
/**
Returns the WeakMap for the given SMP.
*/
var getSMPWeakMap = (sm_platform) => {
if(sm_platform == "Twitter") {
return sm_platform_twitter;
}
else if(sm_platform == "Facebook") {
return sm_platform_facebook;
}
else if(sm_platform == "LinkedIn") {
return sm_platform_linkedin;
}
return undefined;
}
指定された SMP WeakMap にユーザーの SMP リンクを追加する関数。
/**
Adds a SMP link associated with a given User. The User must be already added to the Collection.
*/
var addUserSocialMediaLink = (username, sm_platform, sm_link) => {
let user = getUser(username);
let sm_platform_weakmap = getSMPWeakMap(sm_platform);
if(user && sm_platform_weakmap) {
sm_platform_weakmap.set(user, sm_link);
}
}
特定の SMP に存在するユーザーのみを印刷する機能。
/**
Prints the User's fullname and corresponding SMP link of only those Users which are on the given SMP.
*/
var printSMPUsers = (sm_platform) => {
let sm_platform_weakmap = getSMPWeakMap(sm_platform);
console.log(`Users of ${sm_platform}:`)
users.forEach((user)=>{
if(sm_platform_weakmap.has(user)) {
console.log(`\t${user.fullname} : ${sm_platform_weakmap.get(user)}`)
}
});
}
ユーザーの SMP リンクを追加できるようになりました。また、各ユーザーが複数の SMP にリンクを持つ可能性もあります。
...前の例を続けて、ユーザーに SMP リンクを追加し、ユーザー Bill と Sarah に複数のリンクを追加してから、各 SMP のリンクを個別に出力します。

users
ここで、 を呼び出してユーザーがマップから削除されたとしdeleteUser
ます。これにより、ユーザー オブジェクトへの唯一の参照が削除されます。これにより、(ガベージ コレクションによって) SMP WeakMap の一部またはすべてから SMP リンクが消去されます。これは、ユーザー オブジェクトがないと、その SMP リンクにアクセスする方法がないためです。
...例を続けると、ユーザーBillを削除し、Billが関連付けられていた SMP のリンクを出力します。

SMP リンクを個別に個別に削除するための追加コードは必要ありません。また、この機能が変更される前の既存のコードも変更されていません。
WeakMaps を使用する/使用しないでこの機能を追加する方法が他にある場合は、お気軽にコメントしてください。