Ultimate Guide to Getters ja Setters JavaScriptissä
getters ja antajien ovat toiminnot tai menetelmät saada ja sarja muuttujien arvot. Getter-setter-konsepti on yleinen tietokoneohjelmoinnissa: lähes kaikilla korkean tason ohjelmointikielillä on joukko syntaksia, joilla toteutetaan getters ja setters, mukaan lukien JavaScipt.
Tässä viestissä näemme, mitä gettereita ovat ja miten luo ja käytä niitä JavaScriptissä.
Getters-setters ja kapselointi
Ajatus gettereista ja setereistä mainitaan aina kapseloinnin yhteydessä. Kapselointi voi olla ymmärretään kahdella tavalla.
Ensinnäkin se on EU: n perustaminen data-getters laatijoiden trio käyttää ja muokata näitä tietoja. Tämä määritelmä on hyödyllinen, kun joidenkin toimintojen, kuten validoinnin, on oltava tietoja ennen sen tallentamista tai katsomista ja asettelijoita tarjoavat täydellisen kodin sille.
Toiseksi on olemassa tiukempi määritelmä, jonka mukaan kapselointi tehdään piilota tiedot, jotta se ei olisi käytettävissä muulta koodilta, lukuun ottamatta gettereiden ja asettelijoiden kautta. Näin emme pääty vahingossa kirjoittamalla tärkeitä tietoja jonkin muun koodin kanssa.
Luo getters ja setters
1. Menetelmillä
Koska getters ja seters ovat periaatteessa toimii joka noutaa / muuttaa arvoa, on olemassa useampia tapoja luoda ja käyttää niitä. Ensimmäinen tapa on:
var obj = foo: 'tämä on arvo foo', getFoo: function () palaa tähän.foo; , setFoo: toiminto (val) this.foo = val; console.log (obj.getFoo ()); // "tämä on arvo foo" obj.setFoo ('hello'); console.log (obj.getFoo ()); // "Hei"
Tämä on yksinkertaisin tapa luoda getters ja setters. Siellä on omaisuutta foo
ja on kaksi tapaa: getFoo
ja setFoo
että palauttaa ja määrittää arvon omaisuutta.
2. Avainsanoilla
Lisää “virallinen” ja vankka tapa luoda gettereita ja asettelijoita on saada
ja sarja
avainsanat.
jotta luo getter, aseta saada
avainsana toiminnon ilmoituksen edessä, joka toimii getter-menetelmänä, ja käytä sarja
avainsana samalla tavalla luo setteri. Syntaksi on seuraava:
var obj = fooVal: 'tämä on foo-arvo', saat foo () return this.fooVal; , aseta foo (val) this.fooVal = val; console.log (obj.foo); // "tämä on arvo foo" obj.foo = 'hello'; console.log (obj.foo); // "Hei"
Huomaa, että tiedot voivat olla vain tallennetaan ominaisuuden nimen alle (fooVal
) se on eri getter-setter-menetelmien nimistä (foo
) koska kiinteistö, jolla on getter-setter ei voi pitää tietoja yhtä hyvin.
Mikä tapa on parempi?
Jos päätät luoda avainsanoja ja asetuksia, voit käyttää operaattori määrittää tiedot ja dot-operaattori, samalla tavalla kuin tavallisen kiinteistön arvoksi.
Jos kuitenkin valitset ensimmäisen keinon koodaajien ja asettelijoiden koodaamiseen, sinun täytyy soittaa setteri- ja getter-menetelmiin käyttämällä funktiokutsun syntaksia koska ne ovat tyypillisiä toimintoja (mitään erikoista kuin ne, jotka on luotu käyttämällä saada
ja sarja
avainsanat).
On myös mahdollisuus, että saatat joutua vahingossa jonkin muun arvon määrittäminen ominaisuuksiin, jotka pitivät näitä getter-setter-menetelmiä ja menettää ne kokonaan! Jotain mitä sinun ei tarvitse huolehtia myöhemmässä menetelmässä.
Niinpä, näet, miksi sanoin toinen tekniikka on vakaampi.
Korvaa ehkäisy
Jos jostain syystä haluat ensimmäisen tekniikan, tee ominaisuudet, joilla on getter-setter-menetelmät Lue ainoastaan luomalla ne käyttämällä Object.defineProperties
. Ominaisuudet luotu kautta Object.defineProperties
, Object.defineProperty
ja Reflect.defineProperty
automaattisesti että kirjoitettava: väärä
joka tarkoittaa Lue ainoastaan:
/ * Korvaa ehkäisy * / var obj = foo: 'tämä on arvo foo'; Object.defineProperties (obj, 'getFoo': value: function () return this.foo;, 'setFoo': value: function (val) this.foo = val;); obj.getFoo = 66; // getFooa ei korvata! console.log (obj.getFoo ()); // "tämä on foo-arvo"
Toiminnot getters ja setters
Kun olet ottanut käyttöön getters ja setters, voit mennä eteenpäin suorittaa tietoja ennen sen muuttamista tai palauttamista.
Alla olevassa koodissa tiedot ovat getter-toiminnossa yhdistetty merkkijonoon ennen palauttamista, ja setteritoiminnossa onko arvo numero vai ei suoritetaan ennen päivitystä n
.
var obj = n: 67, get id () return 'Tunnus on:' + this.n; , asettaa id (val) if (tyyppi val === 'numero') this.n = val; console.log (obj.id); // "ID: 67" obj.id = 893; console.log (obj.id); // "ID: 893" obj.id = 'hello'; console.log (obj.id); // "ID on: 893"
Suojaa tiedot gettereillä ja -asetuksilla
Toistaiseksi katimme gettereiden ja setereiden käytön ensimmäisessä kapselointikontekstissa. Siirrymme toiseen, eli miten piilota ulkoisen koodin tiedot gettersin ja asukkaiden avulla.
Suojaamattomat tiedot
Gettersin ja asettelijoiden perustaminen ei tarkoita, että tietoja voidaan käyttää ja muuttaa vain näillä menetelmillä. Seuraavassa esimerkissä se on suoraan koskettamatta getter- ja setter-menetelmiä:
var obj = fooVal: 'tämä on foo-arvo', saat foo () return this.fooVal; , aseta foo (val) this.fooVal = val; obj.fooVal = 'hei'; console.log (obj.foo); // "Hei"
Emme käyttäneet seteriä vaan suoraan muuttanut tietoja (fooVal
). Alun perin asettamat tiedot obj
on mennyt nyt! Voit estää tämän tapahtumasta (vahingossa) tarvitsevat suojaa tiedot. Voit lisätä sen soveltamisalan rajoittaminen siitä, missä tiedot ovat käytettävissä. Voit tehdä sen joko lohkon kattavuus tai funktion kattavuus.
1. Lohkon määritys
Yksi tapa on käytä lohkon soveltamisalaa jonka sisällä tiedot määritetään käyttämällä päästää
avainsana, joka rajoittaa sen soveltamisalaa lohkoon.
lohkon soveltamisala voidaan luoda asettamalla koodi sisällä pari kiharoita. Aina kun luodat lohkoalueen, varmista, että Jätä kommentti sen yläpuolella pyydetään, että olkaimet jätetään yksin, niin ettei kukaan poistaa kiinnikkeet virheellisesti ajattelevat, että ne ovat joitakin ylimääräisiä tarpeettomia kannattimia koodissa tai lisää tarra lohkon soveltamisalaan.
/ * BLOCK SCOPE, jätä pidikkeet yksin! * / let fooVal = 'tämä on arvo foo'; var obj = get foo () return fooVal; , aseta foo (val) fooVal = val fooVal = 'hello'; // ei vaikuta fooValiin lohkon console.log (obj.foo) sisällä; // "tämä on foo-arvo"
Muuttaminen / luominen fooVal
lohkon ulkopuolella ei vaikuta fooVal
viitataan getters-asetelmiin.
2. Toimintojen skaalaus
Tavallisempi tapa suojata tietoja skaalauksen avulla on tietojen säilyttäminen toiminnon sisällä ja palautetaan esine kanssa, jotka ovat tämän toiminnon gettereita ja \ t.
toiminto myobj () var fooVal = 'tämä on arvo foo'; return get foo () return fooVal; , aseta foo (val) fooVal = val fooVal = 'hello'; // ei vaikuta alkuperäiseen fooVal var obj = myobj (); console.log (obj.foo); // "tämä on foo-arvo"
Objekti (kanssa foo ()
getter-setterin sisällä), jonka myobj ()
toiminto on tallennettu obj
, ja sitten obj
on tapana soita Getter ja setter.
3. Tietosuoja ilman kattavuutta
On myös toinen tapa, jolla voit suojata tietojasi korvaamasta rajoittamatta sen soveltamisalaa. Sen takana oleva logiikka kulkee näin: miten voit muuttaa tietoa, jos et tiedä, mitä kutsutaan?
Jos tiedoissa on a ei ole niin helposti toistettavissa oleva muuttujan / ominaisuuden nimi, mahdollisuudet eivät ole kukaan (jopa itseämme) päätyä sen ylikirjoittamiseen antamalla jonkin arvon kyseiselle muuttujalle / ominaisuuden nimelle.
var obj = s89274934764: 'tämä on arvo foo', saat foo () return this.s89274934764; , set foo (val) this.s89274934764 = val; console.log (obj.foo); // "tämä on foo-arvo"
Katso, se on yksi tapa tehdä asioita. Vaikka nimeni, jonka valitsin, ei ole todella hyvä, voit myös käytä satunnaisia arvoja tai symboleja luodaan kiinteistöjen nimiä, kuten Derick Bailey ehdotti tässä blogipostissa. Tärkein tavoite on pitää tiedot piilossa toisesta koodista ja anna getter-setter-parin käyttää sitä / päivittää sitä.
Milloin sinun pitäisi käyttää gettereja ja -asettajia?
Nyt tulee suuri kysymys: aloitatko gettereille ja asukkaille kaikki tiedot nyt?
Jos olet piilottaa tiedot, sitten siellä on ei muuta vaihtoehtoa.
Mutta jos muilla koodilla näkyvät tiedot ovat kunnossa, tarvitsetko silti getters-setereitä vain pakata se koodiin joka suorittaa joitakin operaatioita? sanoisin Joo. Koodi lisää hyvin pian. Yksittäisten tietojen mikroyksiköiden luominen omalla getter-setterillä antaa sinulle itsenäisyyden työskennellä mainituilla tiedoilla vaikuttamatta koodin muihin osiin.