Kratki pregled JavaScript simbola

Simboli

Simboli su novi primitivnitip uveden u ES6. Simboli su potpuno jedinstveni identifikatori. Baš kao i njihovi primitivni kolege ( Number , String , Boolean ), oni se mogu stvoriti pomoću tvorničke funkcije Symbol()koja vraća simbol.

const symbol = Symbol('description')

Svaki put kad pozovete tvorničku funkciju, stvara se novi i jedinstveni simbol. Neobavezni parametar vrijedan nizom je opisni niz koji se prikazuje prilikom ispisa simbola.

> symbol Symbol(description)

Svaki simbol koji je vratio Symbol()je jedinstven, pa svaki simbol ima svoj identitet:

> Symbol() === Symbol() false

Možete primijetiti da su simboli primitivni ako primijenite typeofoperator na jedan od njih - vratit će novi rezultat specifičan za simbol:

> typeof symbol 'symbol'

Slučaj upotrebe: Simboli kao ključevi nejavnih svojstava

Kad god u JavaScript postoje hijerarhije nasljeđivanja, imate dvije vrste svojstava (npr. Stvorene putem klasa, čisto prototipski pristup):

  • Klijenti koda vide javna svojstva
  • Privatna svojstva koriste se interno unutar dijelova koji čine hijerarhiju nasljeđivanja (npr. Klase, objekti).

Radi korisnosti, javna svojstva obično imaju ključeve niza. No, za privatna svojstva s ključevima niza mogu slučajni sukobi imena postati problem. Stoga su simboli dobar izbor.

Na primjer, u sljedećem kodu simboli se koriste za privatna svojstva _counteri _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](); } } }

Imajte na umu da vas simboli štite samo od sukoba imena, a ne od neovlaštenog pristupa. Sve ključeve svojstava objekta - uključujući simbole - možete saznati putem sljedećeg:

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']

Trebaju li nam doista simboli?

Upotrijebite simbole kada je vaš zahtjev jedan od ovih:

  • Enum: Da vam omogući definiranje konstanti sa semantičkim imenima i jedinstvenim vrijednostima.
const directions = { UP : Symbol( ‘UP’ ), DOWN : Symbol( ‘DOWN’ ), LEFT : Symbol( ‘LEFT’ ), RIGHT: Symbol( ‘RIGHT’ ) };
  • Sukobi imena: kada ste željeli spriječiti sudare s ključevima u objektima
  • Privatnost: kada ne želite da su svojstva vašeg objekta nabrojiva
  • Protokoli: Za definiranje načina na koji se objekt može iterirati.

    Zamislite, na primjer, knjižnicu poput draguladefiniranja protokola putem Symbol.for(dragula.moves). Na taj način možete dodati Symbolbilo koji DOM element. Ako DOM element slijedi protokol, tada dragulamože pozvati el[Symbol.for('dragula.moves')]()korisnički definiranu metodu kako bi potvrdio može li se element premjestiti.

  • Dobro poznati simboli: Osim korisnički definiranih simbola, JavaScript ima i neke ugrađene simbole. Oni predstavljaju ponašanje unutarnjeg jezika koje programerima nije bilo izloženo u <ES5. Više informacija ovdje .

Zaključak

Symbolsu JavaScript-u može pružiti jedinstvenost nivoa pristupa objektima. Vrijedno je da svi programeri imaju osnovno razumijevanje njih i njihovih različitih slučajeva korištenja.

code = coffee + developer