A JavaScript szimbólumok gyors áttekintése

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 typeofaz 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 dragulaa protokoll meghatározása Symbol.for(dragula.moves). Hozzáadhat egy metódust Symbolbármely DOM elemhez. Ha egy DOM elem követi a protokollt, akkor dragulameghívhatja a el[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

Symbolsa 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