LEARNING JAVASCRIPT - Trang 190

return

secrets

.

get

(

this

);

}
}
})();

Here we’ve put our

WeakMap

inside an IIFE, along with a class that uses it. Outside the

IIFE, we get a class that we call

SecretHolder

whose instances can store secrets. We

can only set a secret through the

setSecret

method, and only get the secret through

the

getSecret

method:

const

a

=

new

SecretHolder

();

const

b

=

new

SecretHolder

();

a

.

setSecret

(

'secret A'

);

b

.

setSecret

(

'secret B'

);

a

.

getSecret

();

// "secret A"

b

.

getSecret

();

// "secret B"

We could have used a regular

Map

, but then the secrets we tell instances of

SecretHolder

could never be garbage-collected!

Sets

A set is a collection of data where duplicates are not allowed (consistent with sets in

mathematics). Using our previous example, we may want to be able to assign a user to

multiple roles. For example, all users might have the

"User"

role, but administrators

have both the

"User"

and

"Admin"

role. However, it makes no logical sense for a user

to have the same role multiple times. A set is the ideal data structure for this case.
First, create a

Set

instance:

const

roles

=

new

Set

();

Now if we want to add a user role, we can do so with the

add()

method:

roles

.

add

(

"User"

);

// Set [ "User" ]

To make this user an administrator, call

add()

again:

roles

.

add

(

"Admin"

);

// Set [ "User", "Admin" ]

Like

Map

,

Set

has a

size

property:

roles

.

size

;

// 2

Here’s the beauty of sets: we don’t have to check to see if something is already in the

set before we add it. If we add something that’s already in the set, nothing happens:

roles

.

add

(

"User"

);

// Set [ "User", "Admin" ]

roles

.

size

;

// 2

166 | Chapter 10: Maps and Sets