Ultimate sprievodca Getters a Setters v jazyku JavaScript
getry a setters sú použité funkcie alebo metódy dostať a sada hodnoty premenných. Koncept getter-setter je bežné v programovaní počítača: takmer všetky programovacie jazyky na vysokej úrovni prichádzajú so súborom syntaxe na implementáciu getrov a nastavovateľov, vrátane JavaScipt.
V tomto príspevku uvidíme, čo sú getters setters a ako to vytvárať a používať ich v jazyku JavaScript.
Getters-setters a zapuzdrenie
Myšlienka getters a setters je vždy spomenutá v spojení s zapuzdrením. Zapuzdrenie môže byť chápané dvoma spôsobmi.
Po prvé, ide o zriadenie systému data-príjemcovho tvorcovia trio na prístup a úpravu týchto údajov. Táto definícia je užitočná, keď musia byť niektoré operácie, ako napríklad validácia vykonané na údajoch pred ukladaním alebo prezeraním je preňho ideálny domov.
Po druhé, existuje prísnejšia definícia, podľa ktorej sa zapuzdrenie vykonáva skryť údaje, aby bol iný kód nedostupný, okrem tých, ktoré získali a nastavili. Týmto spôsobom neskončíme náhodným prepísaním dôležitých údajov s iným kódom v programe.
Vytvorte Getters a Setters
1. S metódami
Vzhľadom k tomu, getters a setters sú v podstate funguje ktoré prinášajú / menia hodnotu, existujú viac ako jedným spôsobom vytvoriť a používať. Prvý spôsob je:
var obj = foo: 'toto je hodnota foo', getFoo: function () return this.foo; , setFoo: funkcia (val) this.foo = val; konsole.log (obj.getFoo ()); // "to je hodnota foo" obj.setFoo ('ahoj'); console.log (obj.getFoo ()); // "Ahoj"
Toto je najjednoduchší spôsob vytvoriť getters a setters. Je tu nehnuteľnosť foo
a existujú dve metódy: getFoo
a setFoo
na vrátiť a priradiť hodnotu k tomuto majetku.
2. S kľúčovými slovami
Viac “úradné” a robustný spôsob vytvárania getrov a nastavovateľov je pomocou dostať
a sada
Kľúčové slová.
na vytvoriť getra, umiestniť dostať
kľúčových slov pred deklaráciou funkcie, ktorá bude slúžiť ako metóda Getter, a použije sa sada
kľúčových slov rovnakým spôsobom ako vytvorte nastavovač. Syntax je nasledujúci:
var obj = fooVal: 'toto je hodnota foo', get foo () return this.fooVal; , nastaviť foo (val) this.fooVal = val; konsole.log (obj.foo); // "to je hodnota foo" obj.foo = 'ahoj'; console.log (obj.foo); // "Ahoj"
Upozorňujeme, že údaje môžu byť iba uložené pod názvom nehnuteľnosti (fooVal
) to je rozdielny z názvu metód getter-setter (foo
), pretože majetok drží getter-setter nemôžu uchovávať údaje tiež.
Ktorý spôsob je lepší?
Ak sa rozhodnete vytvoriť getrov a nastavovateľov pomocou kľúčových slov, môžete použiť operátor priradenia, aby nastavil dáta a dot prevádzkovateľ získať dáta, rovnakým spôsobom, ako by ste mali prístup / nastavili hodnotu pravidelného vlastníctva.
Ak však vyberiete prvý spôsob kódovania getrov a nastavovateľov, musíte zavolať metódy nastavenia a getra pomocou syntaxe funkcie volania pretože sú to typické funkcie (nič zvláštne, ako tie, ktoré sú vytvorené pomocou dostať
a sada
Kľúčové slová).
Môžete tiež skončiť náhodou priradenie nejakej inej hodnoty k vlastnostiam, ktoré obsahovali metódy getter-setter a stratiť ich úplne! Niečo, čo sa nemusíte obávať v neskoršej metóde.
Takže vidíte, prečo som povedal druhá technika je robustnejšia.
Prepísať prevenciu
Ak z nejakého dôvodu uprednostňujete prvú techniku, vytvorte vlastnosti, ktoré obsahujú metódy getter-setter iba na čítanie ich vytvorením použitím Object.defineProperties
. Vlastnosti vytvorené cez Object.defineProperties
, Object.defineProperty
a Reflect.defineProperty
automaticky konfigurovať na zapisovateľné: falošné
čo znamená iba na čítanie:
/ * Prepísať prevenciu * / var obj = foo: 'toto je hodnota foo'; Object.defineProperties (obj, 'getFoo': hodnota: function () return this.foo;, 'setFoo': hodnota: function (val) this.foo = val;); obj.getFoo = 66; // getFoo nebude prepísaný! console.log (obj.getFoo ()); // "to je hodnota foo"
Operácie vnútri getters a setters
Akonáhle ste predstavili Getters a Setters, môžete pokračovať a vykonávať operácie s údajmi pred zmenou alebo vrátením.
V nižšie uvedenom kóde sú v získavacej funkcii údaje spojený s reťazcom pred vrátením a vo funkcii nastavenia potvrdenie o či je hodnota číslo alebo nie pred aktualizáciou n
.
var obj = n: 67, get id () return 'ID je:' + this.n; , nastavte id (val) if (typeof val === 'číslo') this.n = val; konsole.log (obj.id); // ID je: 67 "obj.id = 893; console.log (obj.id); // ID je: 893 "obj.id = 'ahoj'; console.log (obj.id); // ID je: 893 "
Chráňte dáta pomocou getrov a nastavovačov
Doteraz sme pokryli používanie getrov a setters v prvom kontexte enkapsulácie. Prejdime k druhému, t. J. Ako skryť údaje z vonkajšieho kódu s pomocou getters a setters.
Nechránené údaje
Nastavenie getrov a nastavovateľov neznamená, že dáta môžu byť prístupné a menené iba prostredníctvom týchto metód. V nasledujúcom príklade je to zmenené priamo bez toho, aby sa dotkli metód getra a setter:
var obj = fooVal: 'toto je hodnota foo', get foo () return this.fooVal; , nastaviť foo (val) this.fooVal = val; obj.fooVal = 'ahoj'; console.log (obj.foo); // "Ahoj"
Nastavovač sme nepoužili, ale priamo zmenila údaje (fooVal
). Údaje, ktoré sme pôvodne nastavili vo vnútri obj
je už preč! Aby ste tomu zabránili (náhodou), vy potrebujú istú ochranu pre vaše dáta. Môžete to pridať obmedzenie rozsahu kde sú vaše údaje k dispozícii. Môžete to urobiť buď Blokovanie rozsahu alebo rozsah rozsahu funkcií.
1. Blokovanie rozsahu
Jedna cesta je použite rozsah bloku vnútri ktorej budú údaje definované pomocou nechať
kľúčové slovo, ktoré obmedzuje jeho rozsah pôsobnosti do tohto bloku.
bloku môžete vytvoriť umiestnením kódu vo vnútri páru kučeravých zátvoriek. Kedykoľvek vytvoríte blok bloku, uistite sa, že Zanechať komentár nad tým, že žiada, aby boli závesy ponechané samy, aby nikto odstráni zátvorky omylom si myslia, že sú niektoré extra nadbytočné rámy v kóde alebo pridajte štítok do rozsahu bloku.
/ * BLOCK SCOPE, ponechajte zátky osamote! * / let fooVal = 'toto je hodnota foo'; var obj = get foo () návrat fooVal; , nastaviť foo (val) fooVal = val fooVal = 'ahoj'; // nebude mať vplyv na fooVal vo vnútri bloku console.log (obj.foo); // "to je hodnota foo"
Zmena / vytvorenie fooVal
mimo bloku nebude mať vplyv fooVal
uviedli vnútri getters.
2. Rozsah funkcií
Bežnejší spôsob, ako ochrániť údaje s určením rozsahu, je uchovávanie údajov vo funkcii a vrátenie objektu s getters a setters z tejto funkcie.
funkcia myobj () var fooVal = 'toto je hodnota foo'; návrat get foo () return fooVal; , nastaviť foo (val) fooVal = val fooVal = 'ahoj'; // neovplyvní naše pôvodné fooVal var obj = myobj (); console.log (obj.foo); // "to je hodnota foo"
Objekt (s foo ()
getter-setter vo vnútri) vrátený myObj ()
funkcia je uložené v obj
, a potom obj
je zvyknutý zavolajte na getra a setter.
3. Ochrana údajov bez rozsahu
Existuje aj ďalší spôsob, ako môžete chrániť svoje údaje pred prepísaním bez obmedzenia jeho rozsahu pôsobnosti. Logika za ňou ide takto: ako môžete zmeniť údaj, ak neviete, čo sa nazýva?
Ak majú údaje a nie tak ľahko reprodukovateľný názov premennej / vlastníctva, je pravdepodobné, že nikto (dokonca aj my) sa nakoniec prepisuje priradením nejakej hodnoty tejto hodnote premennej / vlastníctva.
var obj = s89274934764: 'toto je hodnota foo', get foo () return this.s89274934764; , nastaviť foo (val) this.s89274934764 = val; konsole.log (obj.foo); // "to je hodnota foo"
Vidíte, to je jeden spôsob, ako pracovať veci. Aj keď meno, ktoré som si vybral, nie je naozaj dobré, môžete tiež použite náhodné hodnoty alebo symboly vytvoriť názvy vlastníctva, ako to navrhuje Derick Bailey v tomto blogovom príspevku. Hlavným cieľom je uchovávajte údaje skryté z iného kódu a umožnite prístupu / aktualizácii páru getter-setter.
Kedy by ste mali používať getrov a settery?
Teraz prichádza veľká otázka: začínate priraďovať getrov a settery na všetky vaše dáta teraz?
Ak si skrytie údajov, potom je tu žiadna iná možnosť.
Ak sú vaše dáta videné iným kódom, je to v poriadku, stále potrebujete použiť nastavovače Getters len aby to zväzok s kódom ktoré na ňom vykonávajú určité operácie? povedal by som Áno. kód pridáva sa veľmi skoro. Vytváranie mikrojednotiek jednotlivých dát s vlastným getter-setterom poskytuje určitú nezávislosť pracovať na týchto údajoch bez toho, aby to ovplyvnilo iné časti kódu.