Domača » Kodiranje » Ultimate Guide to Getters in Setters v JavaScriptu

    Ultimate Guide to Getters in Setters v JavaScriptu

    Getters in ustanovitelji so uporabljene funkcije ali metode dobite in nastavite vrednosti spremenljivk. Koncept getter-setter je običajno v računalniškem programiranju: skoraj vsi programski jeziki na visoki ravni prihajajo z nizom sintakse za izvajanje getterjev in nastavitev, vključno z JavaSciptom.

    V tej objavi bomo videli, kaj so gettersovi urejevalci in kako ustvarite in jih uporabite v JavaScriptu.

    Geters-setters in enkapsulacija

    Vedno je omenjena zamisel o gobcih v povezavi z enkapsulacijo. Inkapsulacija je lahko razumeti na dva načina.

    Prvič, to je vzpostavitev podatkovne nastavitve trio za dostop in spremembo teh podatkov. Ta definicija je uporabna, kadar morajo biti nekatere operacije, kot je preverjanje veljavnosti podatkov pred shranjevanjem ali pregledovanjem to-getters in setters zagotavljajo popoln dom za to.

    Drugič, obstaja strožja opredelitev, v skladu s katero se opravi inkapsulacija skrij podatke, da bi bilo nedostopno iz druge kode, razen skozi getterje in sesalce. Tako ne bomo končali nenamerno prepisovanje pomembnih podatkov z drugo kodo v programu.

    Ustvarite getters in setters

    1. Z metodami

    Ker so geters in setters v bistvu deluje ki prinese / spremeni vrednost, obstajajo več kot en način da jih ustvarite in uporabite. Prvi način je:

     var obj = foo: 'to je vrednost foo', getFoo: function () return this.foo; , setFoo: funkcija (val) this.foo = val;  console.log (obj.getFoo ()); // "to je vrednost foo" obj.setFoo ('hello'); console.log (obj.getFoo ()); // "zdravo"

    To je na najpreprostejši način ustvariti getters in setters. Obstaja lastnina foo in obstajata dve metodi: getFoo in setFoo do vrnite in dodelite vrednost premoženja.

    2. S ključnimi besedami

    Več “uradni” in robusten način ustvarjanja getterjev in urejevalnikov je z uporabo dobite in nastavite ključne besede.

    Za ustvarite getter, postavite dobite ključno besedo pred izjavo o funkciji, ki bo služila kot metoda getterja in uporabila nastavite ključno besedo na enak način ustvarite seter. Sintaksa je naslednja:

     var obj = fooVal: 'to je vrednost foo', dobite foo () vrnite to.fooVal; , nastavite foo (val) this.fooVal = val;  console.log (obj.foo); // "to je vrednost foo" obj.foo = 'hello'; console.log (obj.foo); // "zdravo" 

    Upoštevajte, da so lahko podatki le shranjene pod imenom lastnosti (fooVal) to je drugačen iz imena metod getter-setter (foo) zato, ker je lastnina, ki ima getter-setter podatkov ni mogoče zadržati prav tako.

    Kateri način je boljši?

    Če se odločite, da boste s ključnimi besedami ustvarili getters in setters, lahko uporabite operaterja za dodelitev podatkov in dot operaterja, da pridobi podatke, na enak način, kot bi dostopali / določali vrednost običajne lastnine.

    Vendar, če izberete prvi način kodiranja getterjev in urejevalnikov, morate poklicati setter in getter metode s pomočjo sintakse klica funkcije ker so tipične funkcije (nič posebnega, kot so tiste, ustvarjene z uporabo dobite in nastavite ključne besede).

    Prav tako obstaja možnost, da boste končali po naključju dodeli drugo vrednost lastnosti, ki so vsebovale te metode getter-setter in jih popolnoma izgubite! Nekaj, kar vam v poznejši metodi ni treba skrbeti.

    Torej lahko vidite, zakaj sem rekel druga tehnika je bolj robustna.

    Preprečevanje prepisovanja

    Če iz nekega razloga raje izberete prvo tehniko, naredite lastnosti, ki vsebujejo metode getter-setter le za branje tako, da jih ustvarite uporabo Object.defineProperties. Lastnosti, ustvarjene preko Object.defineProperties, Object.defineProperty in Reflect.defineProperty samodejno konfigurira do writable: false kar pomeni le za branje:

     / * Preprečevanje prepisovanja * / var obj = foo: 'to je vrednost foo'; Object.defineProperties (obj, 'getFoo': value: function () return this.foo;, 'setFoo': vrednost: funkcija (val) this.foo = val;); obj.getFoo = 66; // getFoo ne bo prepisan! console.log (obj.getFoo ()); // "to je vrednost foo" 

    Operacije znotraj getterjev in urejevalcev

    Ko ste uvedli getterje in ustanove, lahko nadaljujete in izvede operacije na podatkih pred spremembo ali vrnitvijo.

    V spodnji kodi so v funkciji getter podatki združena z nizom pred vrnitvijo in v funkciji seter potrditev ali je vrednost številka ali ne pred posodabljanjem n.

     var obj = n: 67, get id () return 'ID je:' + this.n; , nastavite id (val) if (typeof val === 'number') 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ščitite podatke z aplikatorji in nastavitvami

    Doslej smo zajemali uporabo getterjev in seterjev v prvem kontekstu enkapsulacije. Pojdimo na drugo, t.j. kako skrivanje podatkov iz zunanje kode s pomočjo getterjev in ustanoviteljev.

    Nezaščiteni podatki

    Vzpostavitev getterjev in urejevalnikov ne pomeni, da je podatke mogoče dostopati in jih spreminjati samo s temi metodami. V naslednjem primeru je neposredno spremenjena brez dotikanja metod getterja in setterja:

     var obj = fooVal: 'to je vrednost foo', dobite foo () vrnite to.fooVal; , nastavite foo (val) this.fooVal = val;  obj.fooVal = 'zdravo'; console.log (obj.foo); // "zdravo" 

    Vendar nismo uporabili seterja neposredno spremenil podatke (fooVal). Podatki, ki smo jih prvotno nastavili znotraj obj zdaj ni več! Da bi to preprečili (nehote), vas potrebujete nekaj zaščite za vaše podatke. To lahko dodate omejitev obsega kjer so vaši podatki na voljo. To lahko storite bodisi določanje obsega bloka ali določanje obsega funkcij.

    1. Blokirajte določanje obsega

    Eden od načinov je, da uporabite obseg bloka znotraj katerih bodo podatki definirani z uporabo let ključno besedo, ki omejuje njegov obseg v ta blok.

    A obseg bloka lahko ustvarite tako, da vnesete kodo znotraj par zavitih oklepov. Kadarkoli ustvarite področje bloka, se prepričajte, da Pustite komentar nad njo, ki prosi, da ostanejo naramnice same, tako da nihče odstrani oklepaje če pomotoma pomislimo, da so v kodi nekaj dodatnih odvečnih oklepajev ali dodajte oznako v obseg bloka.

     / * BLOK OBSEG, pustite opornike sam! * / let fooVal = 'to je vrednost foo'; var obj = get foo () vrne fooVal; , nastavite foo (val) fooVal = val fooVal = 'hello'; // ne bo vplival na fooVal znotraj bloka console.log (obj.foo); // "to je vrednost foo"

    Spreminjanje / ustvarjanje fooValzunaj bloka ne vpliva fooVal v notranjosti ustanoviteljev getterjev.

    2. Obseg delovanja

    Bolj običajen način za zaščito podatkov z določitvijo področja uporabe je ohranjanje podatkov znotraj funkcije in vrne predmet z geterji in snemalci iz te funkcije.

     funkcija myobj () var fooVal = 'to je vrednost foo'; return get foo () vrne fooVal; , nastavite foo (val) fooVal = val fooVal = 'hello'; // ne bo vplivalo na naš izvirni fooVal var obj = myobj (); console.log (obj.foo); // "to je vrednost foo"

    Objekt (z foo () v njem), ki ga vrne myobj () funkcija shranjeno v obj, in potem obj se uporablja pokličite getterja in setterja.

    3. Varstvo podatkov brez obsega

    Obstaja tudi drug način, kako zaščititi svoje podatke pred prepisovanjem njegovega obsega. Logika v ozadju je taka: kako lahko spremenite del podatkov, če ne veste, kaj se imenuje?

    Če so podatki a ne tako lahko ponovljivo ime spremenljivke / lastnosti, verjetno nihče (tudi sami) ne bo končal s prepisovanjem, tako da dodeli nekaj vrednosti temu imenu spremenljivke / lastnosti.

     var obj = s89274934764: 'to je vrednost foo', dobite foo () return this.s89274934764; , nastavite foo (val) this.s89274934764 = val;  console.log (obj.foo); // "to je vrednost foo" 

    Vidiš, to je eden od načinov za reševanje stvari. Čeprav ime, ki sem ga izbral, ni res dobro, lahko tudi uporabite naključne vrednosti ali simbole ustvariti imena nepremičnin, kot jih je predlagal Derick Bailey v tem blogu. Glavni cilj je, da hranite podatke skrite iz druge kode in pustite, da jo par getter-setter dostopa / posodablja.

    Kdaj morate uporabiti getters in setters?

    Zdaj prihaja veliko vprašanje: začnete dodeljevati getters in setters vseh vaših podatkov zdaj?

    Če ste skrivanje podatkov, potem je tu nobene druge izbire.

    Ampak, če vaši podatki, ki jih vidijo druge kode je v redu, še vedno morate uporabiti getters nastavitve samo, da ga povežem s kodo ki izvaja nekatere operacije na njem? Rekel bi da. Koda zelo kmalu. Ustvarjanje mikro enot posameznih podatkov z lastnim getter-setterjem vam zagotavlja določeno neodvisnost delati na omenjenih podatkih, ne da bi vplivala na druge dele kode.