Kotisivu » Coding » Ultimate Guide to Getters ja Setters JavaScriptissä

    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 fooVallohkon 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.