de Vali Shah

O prezentare rapidă a simbolurilor JavaScript

O prezentare rapida a simbolurilor JavaScript
Simboluri – JS Primitive

Simboluri

Simbolurile sunt noi primitiv tip introdus în ES6. Simbolurile sunt identificatori complet unici. La fel ca omologii lor primitivi (Număr, Şir, Boolean), pot fi create folosind funcția din fabrică Symbol() care returnează un simbol.

const symbol = Symbol('description')

De fiecare dată când apelați funcția din fabrică, se creează un simbol nou și unic. Parametrul opțional cu valoare de șir este un șir descriptiv care este afișat la imprimarea simbolului.

> symbol
Symbol(description)

Fiecare simbol returnat de Symbol() este unic, deci fiecare simbol are propria identitate:

> Symbol() === Symbol()
false

Puteți vedea că simbolurile sunt primitive dacă aplicați typeof operator la unul dintre ei – va returna un nou rezultat specific simbolului:

> typeof symbol
'symbol'

Utilizare caz: simboluri ca chei ale proprietăților non-publice

Ori de câte ori există ierarhii de moștenire în JavaScript, aveți două tipuri de proprietăți (de exemplu, create prin clase, o abordare pur prototipală):

  • Public proprietățile sunt văzute de clienții codului
  • Privat proprietățile sunt utilizate intern în cadrul pieselor care alcătuiesc ierarhia moștenirii (de exemplu, clase, obiecte).

Din motive de utilizare, proprietățile publice au de obicei chei de tip șir. Dar pentru proprietățile private cu taste de șir, ciocnirile accidentale de nume pot deveni o problemă. Prin urmare, simbolurile sunt o alegere bună.

De exemplu, în următorul cod, simbolurile sunt utilizate pentru proprietățile private _counter și _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]();
        }
    }
}

Rețineți că simbolurile vă protejează numai împotriva ciocnirilor de nume, nu împotriva accesului neautorizat. Puteți afla toate cheile de proprietate ale unui obiect – inclusiv simbolurile – prin următoarele:

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

Chiar avem nevoie de simboluri?

Utilizați simboluri atunci când cerința dvs. este una dintre următoarele:

  • Enum: Pentru a vă permite să definiți constante cu nume semantice și valori unice.
const directions = {
  UP   : Symbol( ‘UP’ ),
  DOWN : Symbol( ‘DOWN’ ),
  LEFT : Symbol( ‘LEFT’ ),
  RIGHT: Symbol( ‘RIGHT’ )
};
  • Nume ciocniri: când ai vrut să previi coliziunile cu cheile din obiecte
  • Confidențialitate: când nu doriți ca proprietățile obiectului dvs. să fie enumerabile
  • Protocoale: Pentru a defini cum poate fi iterat un obiect.
    Imaginați-vă, de exemplu, o bibliotecă de genul dragula definirea unui protocol prin Symbol.for(dragula.moves) . Puteți adăuga o metodă pe aceasta Symbol la orice element DOM. Dacă un element DOM urmează protocolul, atunci dragula ar putea suna la el[Symbol.for('dragula.moves')]() metodă definită de utilizator pentru a afirma dacă elementul poate fi mutat.
  • Simboluri bine cunoscute: În plus față de simbolurile definite de utilizator, JavaScript are câteva simboluri încorporate. Acestea reprezintă comportamente lingvistice interne care nu au fost expuse dezvoltatorilor în aici.

Concluzie

Symbols în JavaScript poate oferi unicitatea nivelului de acces obiectelor. Merită ca toți dezvoltatorii să aibă o înțelegere de bază a acestora și a diferitelor cazuri de utilizare a acestora.

code = coffee + developer