Kiire ülevaade JavaScripti sümbolitest

Sümbolid

Sümbolid on uued primitiivsedES6-s kasutusele võetud tüüp. Sümbolid on täiesti kordumatud identifikaatorid. Nii nagu nende primitiivseid analooge ( arv , string , tõeväärtus ), saab neid luua tehase funktsiooni abil, Symbol()mis tagastab sümbol.

const symbol = Symbol('description')

Iga kord, kui helistate tehase funktsioonile, luuakse uus ja ainulaadne sümbol. Stringiväärtusega valikuline parameeter on kirjeldav string, mis kuvatakse sümboli printimisel.

> symbol Symbol(description)

Iga tagastatud sümbol Symbol()on ainulaadne, seega on igal sümbolil oma identiteet:

> Symbol() === Symbol() false

Kui rakendate typeofoperaatori ühele neist, näete, et sümbolid on primitiivsed - see annab uue sümbolispetsiifilise tulemuse:

> typeof symbol 'symbol'

Kasutusjuht: sümbolid mitteavalike omaduste võtmetena

Alati, kui JavaScriptis on pärilushierarhiad, on teil kahte tüüpi omadusi (nt loodud klasside kaudu, puhtalt prototüüpne lähenemine):

  • Avalikke omadusi näevad koodi kliendid
  • Eraomandit kasutatakse pärandhierarhia moodustavate osade sees (nt klassid, objektid).

Kasutatavuse huvides on avalikel kinnistutel tavaliselt stringivõtmed. Kuid stringivõtmetega eraomandite puhul võivad probleemiks olla juhuslikud nimede kokkupõrked. Seetõttu on sümbolid hea valik.

Näiteks järgmises koodis kasutatakse eraomandite sümboleid _counterja _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](); } } }

Pange tähele, et sümbolid kaitsevad teid ainult nimega kokkupõrgete eest, mitte volitamata juurdepääsu eest. Objekti kõik atribuudivõtmed (sh sümbolid) leiate järgmiselt:

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

Kas me tõesti vajame sümboleid?

Kasutage sümboleid, kui teie nõue on üks järgmistest:

  • Enum: võimaldamaks määratleda semantiliste nimede ja kordumatute väärtustega konstandid.
const directions = { UP : Symbol( ‘UP’ ), DOWN : Symbol( ‘DOWN’ ), LEFT : Symbol( ‘LEFT’ ), RIGHT: Symbol( ‘RIGHT’ ) };
  • Nimede kokkupõrked: kui soovite vältida objektide klahvidega kokkupõrkeid
  • Privaatsus: kui te ei soovi, et teie objekti atribuudid oleksid loendatavad
  • Protokollid: objekti kordamise määramiseks.

    Kujutage näiteks ette sellist teeki nagu dragulaprotokolli määratlemine läbi Symbol.for(dragula.moves). Selle meetodi saate lisada Symboligale DOM-i elemendile. Kui DOM-element järgib protokolli, dragulavõib ta helistada el[Symbol.for('dragula.moves')]()kasutaja määratud meetodile, et kinnitada, kas elementi saab teisaldada.

  • Tuntud sümbolid: lisaks kasutaja määratletud sümbolitele on JavaScripti sisseehitatud sümbolid. Need tähistavad sisemist keelekäitumist, mida arendajad <ES5-s kokku ei puutunud. Lisateave siin .

Järeldus

SymbolsJavaScripti abil saab pakkuda objektidele juurdepääsu taseme ainulaadsust. Kõigil arendajatel on väärt põhiteadmised neist ja nende erinevatest kasutusjuhtumitest.

code = coffee + developer