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 typeof
operaattoria 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 _counter
ja _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
dragula
protokollan määrittely kauttaSymbol.for(dragula.moves)
. Voit lisätä siihen menetelmänSymbol
mihin tahansa DOM-elementtiin. Jos DOM-elementti seuraa protokollaa, sedragula
voi kutsuael[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
Symbols
JavaScript voi tarjota objektien käyttöoikeustason ainutlaatuisuuden. Kaikkien kehittäjien kannattaa olla perustiedot heistä ja niiden erilaisista käyttötapauksista.
code = coffee + developer