Ultimate Guide to Getters i Setters u JavaScriptu
getters i utemeljitelji su funkcije ili metode na kojima se koristi dobiti i set vrijednosti varijabli. Pojam getter-setter uobičajeno u računalnom programiranju: gotovo svi programski jezici visoke razine dolaze sa skupom sintakse za implementaciju gettera i setera, uključujući JavaScipt.
U ovom postu vidjet ćemo što su gettersovi postavljači i kako stvorite ih i koristite ih u JavaScriptu.
Postavljači i inkapsulacija
Uvijek se spominje ideja o getrima i seterima zajedno s enkapsulacijom. Inkapsulacija može biti razumjeti na dva načina.
Prvo, to je postavljanje podaci-getters-setters trio za pristup i izmjenu tih podataka. Ova je definicija korisna kada neke operacije, kao što je provjera valjanosti, moraju biti na podacima prije spremanja ili gledanja it-getters i seters pružiti savršen dom za to.
Drugo, postoji stroža definicija prema kojoj je enkapsulacija napravljena sakrij podatke, kako bi bio nedostupan iz drugog koda, osim kroz gutalice i seljake. Na taj način ne završimo slučajno prepisati važne podatke s nekim drugim kodom u programu.
Napravite getters i setters
1. S metodama
Budući da su geteri i seteri u osnovi funkcionira koje vraćaju / mijenjaju vrijednost, postoje više od jednog načina stvoriti i koristiti ih. Prvi način je:
var obj = foo: 'ovo je vrijednost foo', getFoo: function () return this.foo; , setFoo: funkcija (val) this.foo = val; console.log (obj.getFoo ()); // "ovo je vrijednost foo" obj.setFoo ('hello'); console.log (obj.getFoo ()); // "zdravo"
Ovo je najjednostavniji način stvoriti getters i seters. Postoji imovina foo
i postoje dvije metode: getFoo
i setFoo
do vratite i dodijelite vrijednost na tu imovinu.
2. S ključnim riječima
Više “službeno” i robustan način stvaranja gettera i setera je pomoću dobiti
i set
ključne riječi.
Do stvorite getter, Postaviti dobiti
ključna riječ ispred deklaracije funkcije koja će služiti kao metoda dobitka i koristiti oznaku set
ključna riječ na isti način stvorite setera. Sintaksa je sljedeća:
var obj = fooVal: 'ovo je vrijednost foo', get foo () return this.fooVal; , postavite foo (val) this.fooVal = val; console.log (obj.foo); // "ovo je vrijednost foo" obj.foo = 'hello'; console.log (obj.foo); // "zdravo"
Imajte na umu da podaci mogu biti samo pohranjeni pod nazivom svojstva (fooVal
) to je različit od imena metoda getter-setter (foo
) zbog imovine koja drži detektora ne mogu držati podatke također.
Koji je put bolji?
Ako odlučite stvoriti gettere i postavljače s ključnim riječima, možete upotrijebiti operatora dodjele za postavljanje podataka i dot operater da biste dobili podatke, na isti način na koji biste pristupili / postavili vrijednost uobičajene imovine.
Međutim, ako odaberete prvi način kodiranja gettera i setera, morate pozvati setter i getter metode pomoću sintakse poziva funkcije jer su to tipične funkcije (ništa posebno poput onih kreiranih pomoću dobiti
i set
ključne riječi).
Također, postoji mogućnost da završite slučajno dodjeljivanje neke druge vrijednosti na svojstva koja su sadržavala te metode getter-setter i potpuno ih izgubite! Nešto o čemu ne morate brinuti u kasnijoj metodi.
Dakle, možete vidjeti zašto sam rekao Druga tehnika je robusnija.
Prevencija prepisivanja
Ako iz nekog razloga preferirate prvu tehniku, učinite svojstva koja drže getter-setter metode samo za čitanje stvaranjem koristeći Object.defineProperties
. Svojstva stvorena putem Object.defineProperties
, Object.defineProperty
i Reflect.defineProperty
automatski konfigurirati do mogućnost pisanja: false
što znači samo za čitanje:
/ * Prevencija prepisivanja * / var obj = foo: 'ovo je vrijednost foo'; Object.defineProperties (obj, 'getFoo': value: function () return this.foo;, 'setFoo': vrijednost: funkcija (val) this.foo = val;); obj.getFoo = 66; // getFoo neće biti prepisan! console.log (obj.getFoo ()); // "ovo je vrijednost foo"
Operacije unutar gutača i slagača
Nakon što ste uveli gettere i settere, možete ići naprijed i izvršiti operacije na podacima prije promjene ili vraćanja.
U donjem kodu, u getter funkciji su podaci spojen sa nizom prije nego što se vrati, au funkciji setera provjeru valjanosti je li vrijednost broj ili ne prije ažuriranja n
.
var obj = n: 67, get id () return 'ID je:' + this.n; , postavite id (val) if (tip val === 'broj') this.n = val; console.log (obj.id); // "ID je: 67" obj.id = 893; console.log (obj.id); // "ID je: 893" obj.id = 'hello'; console.log (obj.id); // "ID je: 893"
Zaštitite podatke pomoću gettera i uređaja za određivanje
Do sada smo pokrili uporabu gettera i setera u prvom kontekstu enkapsulacije. Prijeđimo na drugi, tj. Kako sakriti podatke od vanjskog koda uz pomoć getera i setera.
Nezaštićeni podaci
Postavljanje gettera i setera ne znači da se podacima može pristupiti i mijenjati samo pomoću tih metoda. U sljedećem primjeru to je izravno izmijenjeno bez dodirivanja metoda dobivanja i postavljanja:
var obj = fooVal: 'ovo je vrijednost foo', get foo () return this.fooVal; , postavite foo (val) this.fooVal = val; obj.fooVal = 'hello'; console.log (obj.foo); // "zdravo"
Nismo koristili setera, ali izravno je promijenio podatke (fooVal
). Podaci koje smo u početku postavili obj
više nema! Da biste to spriječili (slučajno), vi potrebna je neka zaštita za vaše podatke. To možete dodati po ograničavanje opsega gdje su vaši podaci dostupni. To možete i vi određivanje opsega bloka ili određivanje opsega funkcija.
1. Blokirajte opseg
Jedan od načina je to koristite područje bloka unutar kojih će se podaci definirati pomoću pustiti
ključna riječ koja ograničava njezin opseg do tog bloka.
opseg bloka može se izraditi postavljanjem koda unutar par vitičastih zagrada. Kad god stvorite područje bloka, provjerite jeste li Ostavite komentar iznad njega tražeći da proteza ostane sama, tako da nitko uklanja proteze greškom misleći da su neki dodatni suvišni zagrade u kodu ili dodajte oznaku u područje bloka.
/ * BLOK OPSEGA, ostavite aparate samo! * / let fooVal = 'ovo je vrijednost foo'; var obj = get foo () povratak fooVal; , postavite foo (val) fooVal = val fooVal = 'hello'; // neće utjecati na fooVal unutar bloka console.log (obj.foo); // "ovo je vrijednost foo"
Promjena / stvaranje fooVal
izvan bloka neće utjecati fooVal
upućeni unutar osnivača gettera.
2. Opseg funkcija
Najčešći način zaštite podataka s opsegom je čuvanje podataka unutar funkcije i povratak objekta s geterima i seterima iz te funkcije.
funkcija myobj () var fooVal = 'ovo je vrijednost foo'; return get foo () povratak fooVal; , postavite foo (val) fooVal = val fooVal = 'hello'; // neće utjecati na naš izvorni fooVal var obj = myobj (); console.log (obj.foo); // "ovo je vrijednost foo"
Objekt (sa foo ()
getter-setter unutar njega) myobj ()
je funkcija spremljeno u obj
, i onda obj
koristi se pozvati dobavljača i urednika.
3. Zaštita podataka bez opsega
Postoji i drugi način na koji možete zaštititi svoje podatke od prepisivanja bez ograničavanja opsega. Logika iza toga ide ovako: kako možete promijeniti dio podataka ako ne znate što se zove?
Ako podaci imaju a ne može se tako lako reproducirati ime varijable / svojstva, šanse su da nitko (čak i nas) neće završiti prepisivanjem dodjele neke vrijednosti tom nazivu varijable / svojstva.
var obj = s89274934764: 'ovo je vrijednost foo', get foo () return this.s89274934764; , set foo (val) this.s89274934764 = val; console.log (obj.foo); // "ovo je vrijednost foo"
Vidiš, to je jedan način da se stvari riješe. Iako ime koje sam izabrao nije stvarno dobro, možete također koristite slučajne vrijednosti ili simbole stvoriti imena imovine kao što je predložio Derick Bailey u ovom blogu. Glavni je cilj čuvajte podatke skrivene iz drugog koda i neka ga getter-setter par pristupi / ažurira.
Kada trebate koristiti getters i setters?
Sada dolazi veliko pitanje: počinjete li dodjeljivati gettere i postavljače na sve vaše podatke sada?
Ako si skrivanje podataka, onda postoji nema drugog izbora.
Ali ako se vaši podaci vide drugi kod je u redu, da li još uvijek morate koristiti getters seters samo da ga povežem s kodom koji obavlja neke operacije na njemu? rekao bih Da. Kodirati uskoro se zbraja. Izrada mikro jedinica pojedinačnih podataka s vlastitim getter-setterom pruža vam određenu neovisnost rad na navedenim podacima bez utjecaja na druge dijelove koda.