
Szimbólumok
A szimbólumok új primitívekES6-ban bevezetett típus. A szimbólumok teljesen egyedi azonosítók. Csakúgy, mint primitív társaik ( Szám , Karakterlánc , Logikai ), Symbol()
a szimbólumot adó gyári függvény segítségével is létrehozhatók .
const symbol = Symbol('description')
A gyári funkció minden egyes meghívásakor új és egyedi szimbólum jön létre. Az opcionális karakterlánc-értékű paraméter egy leíró karakterlánc, amely a szimbólum nyomtatásakor jelenik meg.
> symbol Symbol(description)
Minden általuk visszaküldött szimbólum Symbol()
egyedi, ezért minden szimbólumnak megvan a maga identitása:
> Symbol() === Symbol() false
Láthatja, hogy a szimbólumok primitívek, ha typeof
az egyikre alkalmazza az operátort - ez új szimbólum-specifikus eredményt ad:
> typeof symbol 'symbol'
Felhasználási eset: Szimbólumok a nem nyilvános tulajdonságok kulcsaként
Valahányszor vannak öröklési hierarchiák a JavaScript-ben, kétféle tulajdonsággal rendelkezel (pl. Osztályok által létrehozott, pusztán prototípusos megközelítés):
- A nyilvános tulajdonságokat a kód ügyfelei látják
- A magántulajdonokat az öröklési hierarchiát alkotó darabokon belül használják (pl. Osztályok, objektumok).
A használhatóság kedvéért az állami tulajdonokban általában karakterlánc-kulcsok vannak. De a karakterlánccal rendelkező magántulajdonok esetében a véletlen névütközések jelenthetnek problémát. Ezért a szimbólumok jó választás.
Például az alábbi kódot, szimbólumokat használunk magántulajdonoknak _counter
és _action
:
const _counter = Symbol('counter'); const _action = Symbol('action'); class Countdown { constructor(counter, action) { this[_counter] = counter; this[_action] = action; } dec() { let counter = this[_counter]; if (counter < 1) return; counter--; this[_counter] = counter; if (counter === 0) { this[_action](); } } }
Ne feledje, hogy a szimbólumok csak a névütközésektől védenek meg, az illetéktelen hozzáféréstől nem. Az objektum összes tulajdonságkulcsát - beleértve a szimbólumokat is - megtudhatja a következők segítségével:
const obj = { [Symbol('my_key')] : 1, enum : 2, nonEnum : 3 }; Object.defineProperty(obj, 'nonEnum', { enumerable: false }); // Making 'nonEnum' as not enumerable. // Ignores symbol-valued property keys: > Object.getOwnPropertyNames(obj) ['enum', 'nonEnum'] // Ignores string-valued property keys: > Object.getOwnPropertySymbols(obj) [Symbol(my_key)] // Considers all kinds of keys: > Reflect.ownKeys(obj) [Symbol(my_key),'enum', 'nonEnum'] // Only considers enumerable property keys that are strings: > Object.keys(obj) ['enum']
Valóban szükségünk van szimbólumokra?
Használjon szimbólumokat, ha az Ön követelménye az alábbiak egyike:
- Enum: Annak lehetővé tétele, hogy szemantikus nevekkel és egyedi értékekkel állítsunk elő konstansokat.
const directions = { UP : Symbol( ‘UP’ ), DOWN : Symbol( ‘DOWN’ ), LEFT : Symbol( ‘LEFT’ ), RIGHT: Symbol( ‘RIGHT’ ) };
- Névütközések: amikor meg akarta akadályozni az objektumokban lévő kulcsokkal való ütközést
- Adatvédelem: amikor nem szeretné, hogy az objektum tulajdonságai meg legyenek számlálva
- Protokollok: Annak meghatározása, hogyan lehet egy objektumot iterálni.
Képzeljen el például egy olyan könyvtárat, mint például
dragula
a protokoll meghatározásaSymbol.for(dragula.moves)
. Hozzáadhat egy metódustSymbol
bármely DOM elemhez. Ha egy DOM elem követi a protokollt, akkordragula
meghívhatja ael[Symbol.for('dragula.moves')]()
felhasználó által definiált metódust annak igazolására, hogy az elem áthelyezhető-e. - Jól ismert szimbólumok: A felhasználó által definiált szimbólumok mellett a JavaScript tartalmaz néhány beépített szimbólumot. Ezek olyan belső nyelvi magatartást képviselnek, amelyet nem tettek ki a fejlesztők az <ES5-ben. További információ itt .
Következtetés
Symbols
a JavaScript-ben hozzáférési szintű egyediséget biztosíthat az objektumok számára. Minden fejlesztőnek érdemes alaposan megértenie őket és a különféle felhasználási eseteket.
code = coffee + developer