Ultimate Guide to Getters ja Setters JavaScript
Getters ja seadistajad funktsioonid või meetodid saada ja seatud muutujate väärtused. Getter-setteri kontseptsioon on tavaline arvutiprogrammide koostamisel: peaaegu kõik kõrgetasemelised programmeerimiskeeled on varustatud süntaksiga, et rakendada gettereid ja seadmeid, sealhulgas JavaScipt.
Selles postituses näeme, millised getterid on ja kuidas luua ja kasutada neid JavaScriptis.
Getters-setters ja kapseldamine
Idee getters ja setters on alati mainitud koos kapseldamisega. Kapseldamine võib olla mõistetakse kahel viisil.
Esiteks, see on Euroopa Liidu asutamine andmeesitajad-seadjad trio, et neid andmeid juurde pääseda ja neid muuta. See määratlus on kasulik, kui mõned toimingud, näiteks valideerimine, peavad olema andmeid enne selle salvestamist või vaatamist pakuvad need täiuslikku kodu.
Teiseks on olemas rangem määratlus, mille kohaselt tehakse kapseldamine andmete peitmine, muudest koodidest kättesaamatuks, välja arvatud getters ja seadistajad. Nii me ei jõua kogemata üle oluliste andmete mõne muu programmi koodiga.
Loo getters ja seadistajad
1. Meetoditega
Kuna getters ja setters on põhimõtteliselt toimib mis tõmbavad / muudavad väärtust, on olemas mitmel viisil neid luua ja kasutada. Esimene võimalus on:
var obj = foo: see on foo väärtus, getFoo: function () return this.foo; , setFoo: function (val) this.foo = val; console.log (obj.getFoo ()); // "see on foo väärtus" obj.setFoo ('hello'); console.log (obj.getFoo ()); // "Tere"
See on kõige lihtsam viis luua loojaid ja loojaid. Seal on vara foo
ja on kaks meetodit: getFoo
ja setFoo
kuni tagastamine ja väärtuse määramine seda vara.
2. Märksõnadega
Rohkem “ametnik” ja kindel viis luua getters ja seadistajad on kasutades saada
ja seatud
märksõnad.
Et looge getter, asetage saada
märksõna funktsiooni deklaratsiooni ees, mis toimib getteri meetodina, ja kasutage seatud
märksõna samal viisil looge setter. Süntaks on järgmine:
var obj = fooVal: „see on foo väärtus, saada foo () return this.fooVal; , set foo (val) this.fooVal = val; console.log (obj.foo); // "see on foo väärtus" obj.foo = 'hello'; console.log (obj.foo); // "Tere"
Pange tähele, et andmed võivad olla ainult salvestatakse vara nime all (fooVal
) see on erinev getter-setter meetodite nimest (foo
), sest getter-setteri omav vara ei saa andmeid hoida samuti.
Milline viis on parem?
Kui valite märksõnadega loojad ja seadistajad, saate seda kasutada andmeedastuse operaator ja dot-operaator, samamoodi nagu tavalise vara väärtuseks.
Kui aga valite esimesed viisid ja seadistajad kodeerimiseks, peate helistama setter- ja getter-meetoditele funktsiooni kõne süntaksit kasutades sest need on tüüpilised funktsioonid (midagi erilist nagu need, mis on loodud saada
ja seatud
märksõnad).
Samuti on olemas võimalus, et sa võiksid juhuslikult sattuda mõne muu väärtuse määramine nende omaduste suhtes, mis omasid neid getter-setteri meetodeid ja kaotavad need täielikult! Midagi, mida sa ei pea hilisema meetodi pärast muretsema.
Niisiis, näete, miks ma seda ütlesin teine meetod on tugevam.
Ennetuse ülekirjutamine
Kui mingil põhjusel eelistate esimest tehnikat, tehke getter-setteri meetodid Loe ainult luues neid kasutades Object.defineProperties
. Omadused loodud kaudu Object.defineProperties
, Object.defineProperty
ja Reflect.defineProperty
automaatselt konfigureerima kuni kirjutatav: vale
mis tähendab Loe ainult:
/ * Ennetamise vältimine * / var obj = foo: 'see on foo' väärtus; Object.defineProperties (obj, 'getFoo': value: function () return this.foo;, 'setFoo': value: function (val) this.foo = val;); obj.getFoo = 66; // getFoo ei kirjutata üle! console.log (obj.getFoo ()); // "see on foo väärtus"
Toimingud getters ja setters
Kui olete tutvustanud getters ja seadistajad, võite minna ja toimingute teostamiseks enne selle muutmist või tagastamist.
Allolevas koodis on andmed getteri funktsioonis koos stringiga enne tagasisaatmist ja setter-funktsioonis valideerimine kas väärtus on number või mitte tehakse enne värskendamist n
.
var obj = n: 67, get id () return 'ID on:' + see.n; , set id (val) if (tüüp val === 'number') this.n = val; console.log (obj.id); // "ID on: 67" obj.id = 893; console.log (obj.id); // "ID on: 893" obj.id = 'hello'; console.log (obj.id); // "ID on: 893"
Kaitsta andmeid getters ja seters
Siiani käsitlesime kapseldamise esimeses kontekstis getters ja seters kasutamist. Lähme edasi teisele, s.t. peida välise koodi andmeid getters ja setters abiga.
Kaitsmata andmed
Getters ja setters seadistamine ei tähenda, et andmeid on võimalik juurde pääseda ja neid muuta ainult nende meetodite abil. Järgmises näites on see vahetult ilma getteri ja setter-meetodeid puudutamata:
var obj = fooVal: „see on foo väärtus, saada foo () return this.fooVal; , set foo (val) this.fooVal = val; obj.fooVal = 'hello'; console.log (obj.foo); // "Tere"
Me ei kasutanud setterit vahetas vahetult andmeid (fooVal
). Andmed, mille me algselt sisestasime obj
on nüüd kadunud! Selle vältimiseks (juhuslikult) vajavad kaitset teie andmete jaoks. Seda saab lisada reguleerimisala piiramine kohta, kus teie andmed on kättesaadavad. Seda saate teha kas ploki ulatuse määramine või funktsiooni ulatuse määramine.
1. Blokeeri
Üks võimalus on kasutage ploki ulatust mille piires kasutatakse andmeid, kasutades lase
märksõna, mis piirab selle ulatust sellele plokile.
A ploki ulatus saab luua koodi sisestamisega sees paar lokkis traksid. Kui loote ploki ulatuse, veenduge, et Jäta kommentaar selle kohal paludes, et traksid jäetaks üksi, nii et keegi ei saaks seda eemaldab traksid ekslikult mõtlesin, et need on koodis või mõnes liigses üleliigses traksid lisada silt ploki ulatust.
/ * BLOCK SCOPE, jäta traksid üksi! * / let fooVal = 'see on foo väärtus; var obj = get foo () return fooVal; , seadke foo (val) fooVal = val fooVal = 'tere'; // ei mõjuta ploki console.log (obj.foo) fooVali; // "see on foo väärtus"
Muutmine / loomine fooVal
väljaspool plokki ei mõjuta the fooVal
viitab sisekujundajate sisse.
2. Funktsioonide ulatus
Kõige levinum viis andmete kaitsmiseks ulatuse määramisega on andmete hoidmine funktsiooni sees ja objekti tagastamine koos selle funktsiooni getters ja seadistajatega.
funktsioon myobj () var fooVal = 'see on foo väärtus; return get foo () return fooVal; , seadke foo (val) fooVal = val fooVal = 'tere'; // ei mõjuta meie algset fooVal var obj = myobj (); console.log (obj.foo); // "see on foo väärtus"
Objekt (koos foo ()
selle sees), mille on tagastanud myobj ()
funktsioon on salvestatud obj
, ja siis obj
on harjunud helistage getterile ja setterile.
3. Andmekaitse ulatuse määramata
Seal on ka teine viis, kuidas saate oma andmeid üle kirjutada piiramata selle ulatust. Selle taga olev loogika läheb niimoodi: kuidas saab muuta andmeid, kui te ei tea, mida nimetatakse?
Kui andmetel on a mitte nii kergesti reprodutseeritav muutuja / vara nimi, tõenäosus, et keegi (isegi ise) ei suuda seda üle kirjutada, määrates sellele muutujale / omandi nimele teatud väärtuse.
var obj = s89274934764: „see on foo väärtus, saada foo () return this.s89274934764; , set foo (val) this.s89274934764 = val; console.log (obj.foo); // "see on foo väärtus"
Vaata, see on üks viis, kuidas asju teha. Kuigi nimi, mille ma valisin, ei ole tõesti hea, võite ka kasutage juhuslikke väärtusi või sümboleid looma kinnisvara nimesid, nagu Derick Bailey selles blogipostis välja pakkus. Peamine eesmärk on hoidke andmeid peidetud teistest koodidest ja lase getter-setter-paaril seda juurde pääseda / uuendada.
Millal peaksite kasutama getters ja setters?
Nüüd tuleb suur küsimus: kas alustate getters ja setters kõikidele teie andmetele nüüd?
Kui sa oled andmete peitmine, siis on seal mingit muud valikut.
Aga kui teie andmed on teiste koodide näol head, kas peate endiselt kasutama getters-seadmeid lihtsalt kodeerida see koodiga mis teostab mõningaid toiminguid? Ma ütleksin jah. Kood lisab väga kiiresti. Individuaalsete andmete mikroühikute loomine oma getter-setteriga annab teile teatud sõltumatuse töötada nimetatud andmetega, mõjutamata koodi teisi osi.