Ultimate Guide to Getters un Setters JavaScript
Getters un uzstādītāji funkcijas vai metodes gūt un iestatīts mainīgo lielumu vērtības. Getter-seters koncepcija ir izplatīta datorprogrammēšana: gandrīz visās augsta līmeņa programmēšanas valodās ir iekļauts sintakses komplekts, lai īstenotu getters un seters, ieskaitot JavaScipt.
Šajā ziņojumā mēs redzēsim, kas ir getters, un kā to izdarīt izveidojiet un lietojiet tos JavaScript.
Getters-seters un iekapsulēšana
Vienmēr tiek pieminēta ideja par getteriem un noteicējiem kopā ar iekapsulēšanu. Iekapsulēšana var būt saprot divos veidos.
Pirmkārt, tā ir datu uztvērēji trio, lai piekļūtu un mainītu šos datus. Šī definīcija ir noderīga, ja ir jāveic dažas darbības, piemēram, validācija datus pirms to saglabāšanas vai skatīšanas, un to veidotāji nodrošina perfektu mājokli.
Otrkārt, ir stingrāka definīcija, saskaņā ar kuru tiek veikta iekapsulēšana slēpt datus, lai to nepieļautu no cita koda, izņemot getters un noteicējus. Tādā veidā mēs nenonākam nejauši pārrakstīt svarīgus datus ar kādu citu programmas kodu.
Izveidojiet getters un noteicējus
1. Ar metodēm
Tā kā getters un noteicēji ir pamatā darbojas kas ienes / maina vērtību, ir vairākos veidos izveidot un izmantot. Pirmais veids ir:
var obj = foo: 'tas ir foo vērtība, getFoo: funkcija () atgriezties šajā.foo; , setFoo: funkcija (val) this.foo = val; console.log (obj.getFoo ()); // "tas ir foo vērtība" obj.setFoo ('hello'); console.log (obj.getFoo ()); // "Sveiki"
Tas ir vienkāršākais veids izveidot veidotājus un veidotājus. Ir īpašums foo
un ir divas metodes: getFoo
un setFoo
uz atgriezties un piešķirt vērtību uz šo īpašumu.
2. Ar atslēgvārdiem
Vairāk “ierēdnis” un spēcīgs veids, kā radīt getters un noteicējus, ir, izmantojot gūt
un iestatīts
atslēgvārdi.
Uz izveidojiet getter, novietojiet gūt
atslēgvārdu pirms funkcijas deklarācijas, kas kalpos kā getter metode, un izmantot iestatīts
atslēgvārdu tādā pašā veidā izveidot setteru. Sintakse ir šāda:
var obj = fooVal: “tā ir foo vērtība, get foo () return this.fooVal; , iestatiet foo (val) this.fooVal = val; console.log (obj.foo); // "tas ir foo vērtība" obj.foo = 'hello'; console.log (obj.foo); // "Sveiki"
Ņemiet vērā, ka dati var būt tikai glabā zem īpašuma nosaukuma (fooVal
) tas ir atšķiras no getter-seter metožu nosaukuma (foo
), jo īpašums, kuram ir getter-seters nevar turēt datus arī.
Kāds veids ir labāks?
Ja izvēlaties izveidot atslēgvārdus un iestatītājus ar atslēgvārdiem, varat to izmantot uzdevuma operators, lai iestatītu datus un dot operators, lai iegūtu datus, tādā pašā veidā jūs piekļūtu / iestatītu parastā īpašuma vērtību.
Tomēr, ja izvēlaties pirmo veidu, kā kodēt vārdus un iestatītājus, jums ir jāizsauc setter un getter metodes izmantojot funkciju zvanu sintaksi tāpēc, ka tās ir tipiskas funkcijas (nekas īpašs kā tie, kas izveidoti, izmantojot. \ t gūt
un iestatīts
atslēgvārdi).
Tāpat ir iespēja, ka jūs varētu nejauši beigties piešķirt kādu citu vērtību īpašībām, kas turēja šīs getter-seter metodes un zaudē tos pilnībā! Kaut kas jums nav jāuztraucas par turpmāko metodi.
Tātad, jūs varat redzēt, kāpēc es teicu otrā metode ir spēcīgāka.
Pārrakstīt profilaksi
Ja kāda iemesla dēļ jūs dodat priekšroku pirmajai tehnikai, veiciet īpašības, kurām ir getter-setter metodes tikai lasīt izveidojot tos izmantojot Object.defineProperties
. Īpašības, kas izveidotas, izmantojot Object.defineProperties
, Object.defineProperty
un Reflect.defineProperty
automātiski konfigurē uz rakstāms: nepatiesa
kas nozīmē tikai lasīt:
/ * Pārrakstīšanas novēršana * / var obj = foo: 'tā ir vērtība foo'; Object.defineProperties (obj, 'getFoo': value: function () return this.foo;, 'setFoo': vērtība: funkcija (val) this.foo = val;); obj.getFoo = 66; // getFoo netiks pārrakstīts! console.log (obj.getFoo ()); // "šī ir foo vērtība"
Darbības iekšpusē un iesācējiem
Kad esat iepazīstinājis ar spēlētājiem un uzstādītājiem, jūs varat doties uz priekšu un veikt darbības ar datiem pirms to maiņas vai atgriešanas.
Zemāk redzamajā kodā, getter funkcijā, dati ir sajaucas ar virkni pirms atgriešanās, un setterfunkcijā tiek apstiprināta vai vērtība ir skaitlis vai nav tiek veikta pirms atjaunināšanas n
.
var obj = n: 67, get id () return 'ID ir:' + this.n; , iestatiet id (val) if (tips val === 'skaits') this.n = val; console.log (obj.id); // "ID ir: 67" obj.id = 893; console.log (obj.id); // "ID ir: 893" obj.id = 'hello'; console.log (obj.id); // "ID ir: 893"
Aizsargājiet datus ar uztvērējiem un iestatītājiem
Līdz šim mēs iekļāvām getters un noteicēju izmantošanu pirmajā iekapsulēšanas kontekstā. Pāriet uz otro, t.i. slēpt datus no ārējā koda ar getters un noteicēju palīdzību.
Neaizsargāti dati
Getters un noteicēju izveidošana nenozīmē, ka datus var piekļūt un mainīt tikai ar šīm metodēm. Nākamajā piemērā tas ir tieši mainīts nepieskaroties getter un setter metodēm:
var obj = fooVal: “tā ir foo vērtība, get foo () return this.fooVal; , iestatiet foo (val) this.fooVal = val; obj.fooVal = 'hello'; console.log (obj.foo); // "Sveiki"
Mēs neizmantojām setteru, bet tieši mainīja datus (fooVal
). Dati, ko mēs sākotnēji iestatījām obj
ir pagājis tagad! Lai to novērstu (nejauši), jūs nepieciešama aizsardzība jūsu datiem. To var pievienot darbības jomu par to, kur ir pieejami jūsu dati. To var izdarīt ar vienu bloka darbības jomas noteikšana vai funkcijas noteikšana.
1. Bloka noteikšana
Viens veids ir izmantot bloka darbības jomu iekšpusē dati tiks definēti, izmantojot ļaut
atslēgvārds, kas ierobežo tās darbības jomu uz šo bloku.
A bloka darbības joma var izveidot, ievietojot kodu iekšpusē pāris cirtaini lencēm. Kad jūs izveidojat bloka darbības jomu, pārliecinieties, ka Atstājiet savu komentāru virs tā lūdzot, lai bikšturi paliktu vieni, lai neviens nebūtu noņem bikšturi kļūdaini domājot, ka tie ir daži lieli liekie bikšturi kodā vai pievienot etiķeti bloka darbības jomu.
/ * BLOCK SCOPE, atstājiet bikšturi atsevišķi! * / let fooVal = 'tā ir foo vērtība; var obj = get foo () return fooVal; , iestatiet foo (val) fooVal = val fooVal = 'hello'; // netiks ietekmēts fooVal blokā console.log (obj.foo); // "šī ir foo vērtība"
Mainīšana / izveide fooVal
ārpus bloka neietekmēs the fooVal
minēti getters veidotājiem.
2. Funkciju noteikšana
Biežāk sastopamais veids, kā aizsargāt datus ar darbības jomu datu saglabāšana funkcijas ietvaros un atpakaļ ar to funkciju izpildītājiem un noteicējiem.
funkcija myobj () var fooVal = 'tā ir foo vērtība; atgriezties get foo () return fooVal; , iestatiet foo (val) fooVal = val fooVal = 'hello'; // neietekmēs mūsu sākotnējo fooVal var obj = myobj (); console.log (obj.foo); // "šī ir foo vērtība"
Objekts (ar. \ T foo ()
tā iekšpusē ievietots getter-seters) myobj ()
funkcija ir saglabāts obj
, un tad obj
ir pieradis izsauciet getter un setter.
3. Datu aizsardzība bez darbības jomas
Ir arī cits veids, kā aizsargāt savus datus no pārrakstīšanas neierobežojot tās darbības jomu. Tā pamatā ir šāda loģika: kā jūs varat mainīt datu daļu, ja nezināt, kas tiek saukts?
Ja datiem ir a nav tik viegli reproducējams mainīgā / īpašuma nosaukums, Iespējams, ka neviens (pat paši) nebūs gatavs to pārrakstīt, piešķirot kādai vērtībai šo mainīgo / īpašuma nosaukumu.
var obj = s89274934764: 'tas ir foo vērtība, get foo () return this.s89274934764; , iestatiet foo (val) this.s89274934764 = val; console.log (obj.foo); // "šī ir foo vērtība"
Redzēt, tas ir viens no veidiem, kā rīkoties. Lai gan manis izvēlētais vārds nav īsti labs, jūs varat arī izmantot izlases vērtības vai simbolus lai izveidotu īpašuma nosaukumus, kā to ierosināja Derick Bailey šajā emuāra ziņojumā. Galvenais mērķis ir saglabāt datus slēptos no cita koda un ļaujiet Getter-Setter pārim piekļūt / atjaunināt.
Kad jums vajadzētu izmantot getters un noteicējus?
Tagad nāk liels jautājums: vai jūs sākat piešķirt getters un noteicējiem visiem jūsu datiem tagad?
Ja jūs esat slēpj datus, tad tur ir nav citas izvēles.
Bet, ja jūsu dati ir redzami citā kodā, vai jums ir nepieciešams izmantot getters veidotājus vienkārši sasiet to ar kodu kas veic dažas operācijas? Es teiktu Jā. Kods ļoti drīz papildinās. Atsevišķu datu mikro vienību izveide ar savu getter-seteri nodrošina jums zināmu neatkarību strādāt pie minētajiem datiem, neietekmējot citas koda daļas.