Pika kuvaus JavaScript-symboleista

Symbolit

Symbolit ovat uusia primitiivisiäES6: ssa esitelty tyyppi. Symbolit ovat täysin yksilöllisiä tunnisteita. Aivan kuten primitiiviset vastineet ( numero , merkkijono , looginen ), ne voidaan luoda tehdasfunktiolla, Symbol()joka palauttaa symbolin.

const symbol = Symbol('description')

Joka kerta, kun soitat tehdasfunktiolle, luodaan uusi ja ainutlaatuinen symboli. Valinnainen merkkijonoarvoinen parametri on kuvaileva merkkijono, joka näytetään symbolia tulostettaessa.

> symbol Symbol(description)

Jokainen palauttama symboli Symbol()on ainutlaatuinen, joten jokaisella symbolilla on oma identiteettinsä:

> Symbol() === Symbol() false

Symbolit ovat primitiivisiä, jos käytät typeofoperaattoria johonkin niistä - se palauttaa uuden symbolikohtaisen tuloksen:

> typeof symbol 'symbol'

Käyttötapaus: Symbolit muiden kuin julkisten kohteiden avaimina

Aina kun JavaScriptissä on perintöhierarkioita, sinulla on kahdenlaisia ​​ominaisuuksia (esim. Luodaan luokkien kautta, puhtaasti prototyyppinen lähestymistapa):

  • Koodin asiakkaat näkevät julkiset ominaisuudet
  • Yksityisiä kiinteistöjä käytetään sisäisesti perintöhierarkian muodostavien kappaleiden sisällä (esim. Luokat, objektit).

Käytettävyyden vuoksi julkisilla kohteilla on yleensä merkkijonoavaimet. Mutta merkkijonoavaimilla varustetuissa yksityisissä kiinteistöissä tahattomista nimiristiriidoista voi tulla ongelma. Siksi symbolit ovat hyvä valinta.

Esimerkiksi seuraavassa koodissa symboleja käytetään yksityisiin kiinteistöihin _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](); } } }

Huomaa, että symbolit suojaavat vain nimiristiriidoilta, ei luvattomalta käytöltä. Voit selvittää objektin kaikki ominaisuusavaimet - myös symbolit - seuraavien kautta:

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

Tarvitsemmeko todella symboleja?

Käytä symboleja, kun vaatimus on yksi näistä:

  • Enum: Antaa sinun määrittää vakioita semanttisilla nimillä ja yksilöllisillä arvoilla.
const directions = { UP : Symbol( ‘UP’ ), DOWN : Symbol( ‘DOWN’ ), LEFT : Symbol( ‘LEFT’ ), RIGHT: Symbol( ‘RIGHT’ ) };
  • Nimi- törmäykset : kun haluat estää törmäykset esineiden avaimiin
  • Tietosuoja: kun et halua kohteen ominaisuuksien olevan lueteltavia
  • Protokollat: Määritetään, miten objekti voidaan toistaa.

    Kuvittele esimerkiksi kirjastoa, kuten dragulaprotokollan määrittely kautta Symbol.for(dragula.moves). Voit lisätä siihen menetelmän Symbolmihin tahansa DOM-elementtiin. Jos DOM-elementti seuraa protokollaa, se dragulavoi kutsua el[Symbol.for('dragula.moves')]()käyttäjän määrittelemää menetelmää varmistaakseen, voidaanko elementtiä siirtää.

  • Tunnetut symbolit: Käyttäjän määrittelemien symbolien lisäksi Javascriptissa on joitain sisäänrakennettuja symboleja. Nämä edustavat sisäistä kielikäyttäytymistä, jota kehittäjät eivät altistaneet <ES5: ssä. Lisätietoja täältä .

Johtopäätös

SymbolsJavaScript voi tarjota objektien käyttöoikeustason ainutlaatuisuuden. Kaikkien kehittäjien kannattaa olla perustiedot heistä ja niiden erilaisista käyttötapauksista.

code = coffee + developer