Galutinis „Getters“ ir „Setters“ vadovas „JavaScript“
Getters ir kūrėjai yra funkcijos ar metodai gauti ir nustatyti kintamųjų reikšmes. Getter-seter koncepcija įprastas kompiuterių programavimas: beveik visose aukšto lygio programavimo kalbose yra sintaksės rinkinys, skirtas diegėjams ir nustatytojams, įskaitant „JavaScipt“.
Šiame pranešime pamatysime, kokie getters yra ir kaip kurti ir naudoti juos „JavaScript“.
Getters-setters ir kapsuliavimas
Visuomet paminėta idėjų apie nusikaltėlius ir steigėjus kartu su kapsulėmis. Kapsuliavimas gali būti suprantama dviem būdais.
Pirma, tai yra įsteigimas duomenų getteriai trio, kad galėtumėte pasiekti ir keisti šiuos duomenis. Ši apibrėžtis yra naudinga, kai turi būti atliekamos kai kurios operacijos, pvz., Patvirtinimas duomenis prieš taupydami ar peržiūrėdami „getters“ ir „seters“, tai puikiai tinka jam.
Antra, yra griežtesnė apibrėžtis, pagal kurią atliekama kapsulė slėpti duomenis, kad jis nebūtų pasiekiamas iš kito kodo, išskyrus per getters ir steigėjų. Tokiu būdu mes nesibaigiame netyčia perrašyti svarbius duomenis su kitu programos kodu.
Sukurkite „getters“ ir „seters“
1. Su metodais
Nuo getters ir steigėjai yra iš esmės veikia kad parsisiunčia / pakeičia vertę, yra keliais būdais kurti ir naudoti. Pirmasis būdas yra:
var obj = foo: „tai yra foo vertė, getFoo: function () return this.foo; , setFoo: funkcija (val) this.foo = val; console.log (obj.getFoo ()); // "tai yra foo vertė" obj.setFoo ('hello'); console.log (obj.getFoo ()); // "Sveiki"
Tai yra paprasčiausias būdas sukurti kūrėjus ir steigėjus. Yra nuosavybė foo
ir yra du būdai: getFoo
ir setFoo
į grąžinti ir priskirti vertę to turto.
2. Su raktiniais žodžiais
Daugiau “pareigūnas” ir tvirtas būdas kurti „getters“ ir „seters“ yra naudojant gauti
ir nustatyti
raktiniai žodžiai.
Į sukurti getter, įdėkite gauti
raktinis žodis prieš funkcijų deklaraciją, kuri bus naudojama kaip getter metodas, ir naudokite nustatyti
raktinis žodis taip pat sukurti setter. Sintaksė yra tokia:
var obj = fooVal: „tai yra foo vertė“, gaukite foo () return this.fooVal; , nustatyti foo (val) this.fooVal = val; console.log (obj.foo); // "tai yra foo vertė" obj.foo = 'hello "; console.log (obj.foo); // "Sveiki"
Atkreipkite dėmesį, kad duomenys gali būti tik saugomi po nuosavybės pavadinimu (fooVal
) tai skiriasi iš getter-seter metodų (foo
), nes turtas, turintis getter-seterį negali turėti duomenų taip pat.
Kuris būdas yra geresnis?
Jei pasirinksite sukurti raktinius žodžius ir nustatymus, galite naudoti priskyrimo operatorius duomenims nustatyti ir taško operatorius, kad gautų duomenis, taip pat, kaip ir prieigą prie reguliaraus turto vertės.
Tačiau, jei pasirenkate pirmąjį kodavimo ir nustatymo būdą, turite skambinti setter ir getter metodais naudojant funkcijų skambučio sintaksę nes jie yra tipiškos funkcijos (nieko ypatingo kaip tie, kurie sukurti naudojant gauti
ir nustatyti
raktiniai žodžiai).
Be to, yra tikimybė, kad galbūt atsitiks netyčia priskirti kitą vertę savybes, turinčias tuos getter-setter metodus ir prarasti juos visiškai! Kažkas, kurio jums nereikės nerimauti dėl vėlesnio metodo.
Taigi, galite pamatyti, kodėl aš sakiau antrasis metodas yra tvirtesnis.
Perrašyti prevenciją
Jei dėl kokių nors priežasčių pirmenybė teikiama pirmajai technikai, atlikite getter-setter metodus Tik skaitymui sukuriant juos naudojant Object.defineProperties
. Savybės sukurtos per Object.defineProperties
, Object.defineProperty
ir Reflect.defineProperty
automatiškai konfigūruojama į rašoma: klaidinga
tai reiškia Tik skaitymui:
/ * Perrašyti prevenciją * / var obj = foo: „tai foo ' vertė; Object.defineProperties (obj, 'getFoo': value: function () return this.foo;, 'setFoo': value: function (val) this.foo = val;); obj.getFoo = 66; // getFoo nebus perrašyta! console.log (obj.getFoo ()); // "tai yra foo vertė"
Operacijos viduje ir steigėjų
Kai įvedate „getters“ ir „seters“, galite eiti į priekį ir atlikti operacijas su duomenimis prieš keisdami ar grąžindami.
Toliau pateiktame kode getter funkcija yra susietas su eilute prieš grąžinant, ir setter funkcijoje - patvirtinimas ar vertė yra skaičius, ar ne atliekamas prieš atnaujinant n
.
var obj = n: 67, get id () return 'ID yra:' + this.n; , nustatykite id (val) if (tipo val === 'numeris') this.n = val; console.log (obj.id); // "ID yra: 67" obj.id = 893; console.log (obj.id); // "ID yra: 893" obj.id = 'hello'; console.log (obj.id); // "ID yra: 893"
Apsaugokite duomenis su siųstuvais ir nustatytuvais
Iki šiol aptarėme „getters“ ir „seters“ naudojimą pirmajame kapsulių kontekste. Pereikime prie antrojo, t. Y slėpti išorinio kodo duomenis padedančiųjų ir steigėjų pagalba.
Neapsaugoti duomenys
Sukūrėjų ir steigėjų sukūrimas nereiškia, kad duomenis galima pasiekti ir keisti tik šiais būdais. Toliau pateiktame pavyzdyje tiesiogiai pasikeitė neliesdami getter ir setter metodų:
var obj = fooVal: „tai yra foo vertė“, gaukite foo () return this.fooVal; , nustatyti foo (val) this.fooVal = val; obj.fooVal = 'hello'; console.log (obj.foo); // "Sveiki"
Mes nenaudojome setter, bet tiesiogiai pakeitė duomenis (fooVal
). Iš pradžių nustatyti duomenys obj
dabar dingo! Norėdami tai išvengti (atsitiktinai), jūs reikia tam tikros apsaugos už savo duomenis. Tai galite pridėti iki taikymo sritį apie tai, kur yra jūsų duomenys. Tai galite padaryti bet kuriuo blokavimo apimties nustatymas arba funkcija.
1. Blokavimo apimties nustatymas
Vienas iš būdų yra naudoti blokų taikymo sritį viduje duomenys bus apibrėžti naudojant leisti
raktinis žodis riboja jos taikymo sritį prie šio bloko.
A bloko taikymo sritis gali būti sukurtas pateikiant kodą viduje garbanotais petnešomis. Kai kuriate blokų sritį, įsitikinkite, kad Palikite komentarą virš jo prašo, kad petnešos būtų paliktos vienas, kad niekas pašalina petnešos klaidingai manydamas, kad jie yra kai kurie papildomi nereikalingi brūkšneliai kode arba pridėti etiketę pagal blokų taikymo sritį.
/ * BLOKO TAIKYMAS, palikite petnešos vieni! * / let fooVal = 'tai yra foo vertė; var obj = get foo () return fooVal; , nustatykite foo (val) fooVal = val fooVal = 'hello'; // nedarys įtakos fooVal blokui console.log (obj.foo); // "tai yra foo vertė"
Keisti / kurti fooVal
už bloko ribų neturės įtakos fooVal
nurodomi getters'o kūrėjų viduje.
2. Funkcijų nustatymas
Paprastesnis būdas apsaugoti duomenis pagal taikymo sritį yra iki duomenų saugojimo funkcija ir grąžinti objektą su getteriais ir nustatytojais iš šios funkcijos.
funkcija myobj () var fooVal = 'tai foo vertė; return get foo () return fooVal; , nustatykite foo (val) fooVal = val fooVal = 'hello'; // neturės įtakos mūsų originaliam fooVal var obj = myobj (); console.log (obj.foo); // "tai yra foo vertė"
Objektas (su. \ T foo ()
Getter-Setter viduje), kurį grąžino myobj ()
funkcija yra išsaugota obj
, ir tada obj
turi įprotį skambinkite Getter ir Setter.
3. Duomenų apsauga be taikymo srities
Taip pat yra kitas būdas, kuriuo galite apsaugoti savo duomenis nuo perrašymo neapribojant jo taikymo srities. Jo logika yra tokia: kaip jūs galite pakeisti duomenis, jei nežinote, kas vadinama?
Jei duomenys turi a ne taip lengvai atkuriamas kintamojo / nuosavybės pavadinimas, tikimybė, kad niekas (netgi pats) nustos jį perrašyti, priskirdamas tam tikrą reikšmę šiam kintamajam / nuosavybės pavadinimui.
var obj = s89274934764: „tai yra foo vertė“, gaukite foo () return this.s89274934764; , set foo (val) this.s89274934764 = val; console.log (obj.foo); // "tai yra foo vertė"
Pažiūrėkite, tai yra vienas iš būdų, kaip dirbti. Nors mano pasirinktas vardas nėra tikrai geras, taip pat galite naudoti atsitiktines vertes arba simbolius kuriant nuosavybės pavadinimus, kuriuos pasiūlė Derick Bailey šiame dienoraštyje. Pagrindinis tikslas yra saugoti duomenis paslėpti iš kito kodo ir leiskite „getter-seter“ porai ją pasiekti / atnaujinti.
Kada turėtumėte naudoti getters ir seters?
Dabar ateina didelis klausimas: ar pradedate priskirti getterius ir kūrėjus visus duomenis dabar?
Jei esate slėpti duomenis, tada ten yra jokio kito pasirinkimo.
Bet jei jūsų duomenys yra matomi kitu kodu, ar jums vis tiek reikia naudoti „getters“ kūrėjus tiesiog susieti jį su kodu kuri atlieka kai kurias operacijas? Sakyčiau taip. Kodas labai greitai. Individualių duomenų mikro vienetų kūrimas su savo getter-seteriu suteikia jums tam tikrą nepriklausomybę dirbti su minėtais duomenimis nepaveikiant kitų kodo dalių.