kapselointi Javascriptissä

tämä on viimeinen postaukseni ”JavaScript for (C/)AL Developers” – sarjassa tänään. Jos olen jatkanut blogging noin lähes puhdasta JavaScript kamaa, voit kohtuullisesti kysyä, jos tämä on itse asiassa NAV blogi tai JavaScript yksi. Se on edelleen NAV, ja vaikka tavaraa olen aikeissa kirjoittaa on puhtaasti JavaScript käsite, mielestäni se on erittäin relevantti tahansa control add-In Kehittäjä. Pitele oluttani ja kestä vielä yksi.

yksi JavaScriptistä usein kuulemistani valituksista on, että Javascriptissä ei ole kapselointia. Tämä on lähes täysin totta, paitsi että se on täysin väärä.

missä ongelma ylipäätään on,ja mikä sitten on ratkaisu? Sukelletaan.

ongelma

Kuvittele julistavasi rakentajaksi. Kuvittele hetki, että olemme ES5-maailmassa (jota meidän on valitettavasti käytettävä, jos haluamme control-lisäosiemme olevan täysin yhteensopivia kaikkien alustojen kanssa, joilla sekä NAV että Business Central ovat tuettuja).

tämä on minun koodini:

tämä näyttää 42-vuotiaalta, joka on nykyinen ikäni.

pian on syntymäpäiväni, joten tämä näkyisi 43:

nyt, vaikka haluaisin ehdottomasti pystyä tekemään jotain tällaista tosielämässä:

… niin ei tule tapahtumaan. Kunnon esinekeskeisessä maailmassa ” iän ” pitäisi olla kapseloitu ominaisuus, eikä vjekoksi pitäisi voida kutsua.Ikä = 25 ollenkaan. C# – ja” normal ” -oliopainotteisilla kielillä on kapseloinnin käsite, ne voivat käsitellä tätä käyttämällä yksityisiä kenttiä, mutta Javascriptillä ei ole käsitettä yksityinen. Kaikki tässä määritelty objektin rakentajan sisällä (tai myöhemmin konstruoidun objektin instanssissa) on täysin saatavilla kaikille koodeille, joilla on pääsy kyseiseen instanssiin. Yllä olevassa Esimerkissäni kuka tahansa voi asettaa iän ja päästä siitä kuin koira veräjästä.

voisi sanoa, että Javascriptissä ei ole kapselointia. Ja kuten edellä sanoin, olisit täysin väärässä.

ratkaisu

niin ilmeistä kuin onkin, että emme voi julistaa mitään yksityiseksi suoraan, on silti asioita, joita voimme käyttää. Yksi kaunis konsepti, joka tulee kätevä on nimeltään closures. Sulkemisia selitetään pitkään miljoonilla blogeilla, dokumentointisivustoilla ja koodiesimerkeillä ympäri Internetiä, ja voit googlata ne omaan tahtiisi, joten en pure sulkemisten selittämiseen täällä. Käytän niitä kapselointiongelman ratkaisemiseen.

on ainakin kaksi tapaa, miten tämän voisi hoitaa. Tehdään ensin ilmeisempi: access-toiminto.

Kuvittele maailma ilman ominaisuuksia, joissa et voi tehdä objektia.omaisuus = arvo (kuten vjeko.Ikä = 25 meidän tapauksessamme, niin paljon kuin olisin täysin rakastan sitä!). Siinä maailmassa, sinulla olisi getter ja setter toiminnot:

(unohda hetkeksi, että käytän tätä edelleen.Ikä ”kapseloida ””ominaisuus”)

ilmeisesti näitä voisi kutsua näin:

sitten, jos haluat olla ikä kuin luku-vain, voit yksinkertaisesti pudottaa setAge setter toiminto. Jos tämä.ikä oli todella yksityinen (mitä se ei ole), tämä tekisi temppu sinulle. Ongelma on, että mikään tässä määritelty ei ole yksityistä, se on kaikkien saatavilla, joilla on pääsy mihin tahansa esineeseen. Se on niin julkinen kuin vain voi olla.

tämän ongelman korjaamiseksi on ensimmäiseksi siirrettävä getterin funktioilmoitus prototyypistä instanssiin. Prototyyppijäsenet ovat lähimpänä sitä, mitä kutsuisimme staattisiksi C#: ssa, vaikka runtime-tilassa heillä on tiettyjä käyttäytymispiirteitä sekä staattisista että instanssijäsenistä. Kuitenkin, Let ’ s ensin siirtää jäsen pois prototyyppi, ja päälle instance:

tämä ratkaisee vain ongelman ensimmäisen osan, sen, että getAge määriteltiin prototyypissä eikä tapauksessa. Kuitenkin yksinkertainen muutos, kuten tämä:

… ratkaisemme ongelman kokonaan:

ikä on nyt täysin kapseloitu. Voit käyttää sitä getter-toiminnon kautta, mutta et voi asettaa sitä suoraan, koska se on käytettävissä vain tämän sulkemisalueella.getAge esimerkiksi toiminto.

Henkilöluokan täysimittainen toteuttaminen edellyttää, että growOlder-funktio siirretään prototyypistä instanssiin:

ja tämä toimii juuri niin kuin haluat sen toimivan:

mutta miksi se toimii? Se toimii sulkemisten takia. Constructorin ikäparametri otettiin kiinni sekä getAge-että growOlder-toimintojen sulkemisalueeseen, jolloin voit käyttää sen arvoa molemmista toiminnoista, mutta se on täysin saavuttamattomissa kenellekään muulle, missä tahansa muualla.

vielä parempi ratkaisu

voisi sanoa, että et halua käyttää sitä getter-funktion kautta, ja että tarvitset täyden lukuoikeuden syntaksin. Haluat ikäsi vain lukuna ja kapseloituna samaan aikaan. Sainpas! JavaScript ei voi kiteyttää, että! Paitsi että se ehdottomasti voi.

käsittelin kohdetta.defineProperty menetelmä minun Edellinen viesti, ja jos luet, että yksi, voit heti nähdä, miten sitä voidaan soveltaa täällä.

määritellään siis persoonaluokan lukuilmaisuominaisuus:

noin. Se ei sattunut. Ja se toimii:

siinä se on. Täysi kapselointi JavaScript auttaa kirjoittamaan hyvä, eristetty koodi, ja ottaa control add-ins real kick-$$ tasolla.

Happy JavaScripting, and I hope to get more time to blog about other cool and beneful JavaScript tips and tricks for (C/)AL developers.

Vastaa

Sähköpostiosoitettasi ei julkaista.