Ултимате Гуиде то Геттерс и Сеттерс у ЈаваСцрипту
Геттерс и сетерс се користе функције или методе добити и комплет вредности променљивих. Појам геттер-сеттер је уобичајено у компјутерском програмирању: готово сви програмски језици високог нивоа долазе са скупом синтаксе за имплементацију геттера и сетера, укључујући ЈаваСципт.
У овом посту, видећемо шта су добављачи и како креирајте их и користите их у ЈаваСцрипту.
Поставља и поставља капсуле
Идеја о гетерима и сетерима се увек помиње у вези са енкапсулацијом. Инкапсулација може бити разумети на два начина.
Прво, то је успостављање дата-геттерс-сеттерс трио за приступ и измену тих података. Ова дефиниција је корисна када неке операције, као што је провјера ваљаности, морају бити на подацима пре него што сачувате или прегледате, гетерс и сетери обезбеђују савршен дом за њега.
Друго, постоји строжа дефиниција према којој се врши енкапсулација сакриј податке, да би био недоступан из другог кода, осим кроз гутаче и сељаке. На тај начин не завршимо случајно преписивање важних података са неким другим кодом у програму.
Направите геттерс и сеттерс
1. Са методама
Пошто су гетери и сетери у основи функционише које добијају / мењају вредност, постоје више од једног начина да их креирате и користите. Први начин је:
вар обј = фоо: 'ово је вредност фоо', гетФоо: фунцтион () ретурн тхис.фоо; , сетФоо: фунцтион (вал) тхис.фоо = вал; цонсоле.лог (обј.гетФоо ()); // "ово је вредност фоо" обј.сетФоо ('хелло'); цонсоле.лог (обј.гетФоо ()); // "Здраво"
Ово је најједноставнији начин за стварање геттера и сетера. Постоји имовина фоо
и постоје два начина: гетФоо
и сетФоо
до вратите и доделите вредност на ту имовину.
2. Са кључним речима
А море “званичник” и робустан начин креирања геттера и сетера је коришћењем добити
и комплет
кључне речи.
До створите гетера, поставите добити
кључне речи испред декларације функције која ће служити као метода геттера и користити комплет
кључне речи на исти начин направите сетера. Синтакса је следећа:
вар обј = фооВал: 'ово је вредност фоо', гет фоо () ретурн тхис.фооВал; , сет фоо (вал) тхис.фооВал = вал; цонсоле.лог (обј.фоо); // "ово је вриједност фоо" обј.фоо = 'хелло'; цонсоле.лог (обј.фоо); // "Здраво"
Имајте на уму да подаци могу бити само чува се под именом (фооВал
) то је различит од имена метода геттер-сеттер (фоо
) због имовине која држи детектора не могу држати податке такође.
Који је пут бољи?
Ако одлучите да креирате геттере и сетере са кључним речима, можете да користите задатак оператера за постављање података анд тхе дот оператер да добије податке, на исти начин на који бисте приступили / подесили вредност регуларне имовине.
Међутим, ако одаберете први начин кодирања геттера и сетера, морате позвати сеттер и геттер методе користећи синтаксу позива функције јер су то типичне функције (ништа посебно као што су оне креиране помоћу добити
и комплет
кључне речи).
Такође, постоји шанса да завршите случајно додељивање неке друге вредности на својства која су држала те методе геттер-сеттер и потпуно их изгубите! Нешто о чему не морате бринути у каснијој методи.
Дакле, можете видјети зашто сам рекао Друга техника је робуснија.
Превенција преписивања
Ако из неког разлога преферирате прву технику, направите својства која држе геттер-сеттер методе само за читање стварањем Користећи Објецт.дефинеПропертиес
. Својства креирана преко Објецт.дефинеПропертиес
, Објецт.дефинеПроперти
и Рефлецт.дефинеПроперти
аутоматски конфигурирати до вритабле: фалсе
што значи само за читање:
/ * Превенција преписивања * / вар обј = фоо: 'ово је вредност фоо'; Објецт.дефинеПропертиес (обј, 'гетФоо': валуе: фунцтион () ретурн тхис.фоо;, 'сетФоо': валуе: фунцтион (вал) тхис.фоо = вал;); обј.гетФоо = 66; // гетФоо неће бити преписан! цонсоле.лог (обј.гетФоо ()); // "ово је вредност фоо-а"
Операције унутар гетерс и сетерс
Једном када сте увели гитаристе и сељатеље, можете ићи напријед и обавља операције на подацима пре промене или враћања.
У коду испод, у геттер функцији су подаци спојен са низом пре него што се врати, иу функцији сетера валидацију да ли је вредност број или не обавља се пре ажурирања н
.
вар обј = н: 67, гет ид () повратак 'ИД је:' + тхис.н; , сет ид (вал) иф (типеоф вал === 'нумбер') тхис.н = вал; цонсоле.лог (обј.ид); // "ИД је: 67" обј.ид = 893; цонсоле.лог (обј.ид); // "ИД је: 893" обј.ид = 'хелло'; цонсоле.лог (обј.ид); // "ИД је: 893"
Заштитите податке помоћу геттера и сетера
До сада смо покрили употребу геттера и сетера у првом контексту енкапсулације. Пређимо на други, тј сакрити податке од вањског кода уз помоћ гетера и сетера.
Незаштићени подаци
Постављање геттера и сетера не значи да се подацима може приступити и променити само помоћу тих метода. У следећем примеру то је директно промењена без додиривања метода геттера и сетера:
вар обј = фооВал: 'ово је вредност фоо', гет фоо () ретурн тхис.фооВал; , сет фоо (вал) тхис.фооВал = вал; обј.фооВал = 'здраво'; цонсоле.лог (обј.фоо); // "Здраво"
Нисмо користили сетера, али директно је променио податке (фооВал
). Подаци које смо иницијално поставили обј
је отишао сада! Да бисте спречили да се ово догоди (случајно), ви потребна нека заштита за ваше податке. То можете додати и путем ограничавање обима где су ваши подаци доступни. То можете и ви блок сцопинг или функција сцопинг.
1. Блокирајте опсег
Један начин је то користите блок опсег унутар којих ће подаци бити дефинисани помоћу дозволити
кеиворд тхат ограничава њен опсег до тог блока.
А блоцк сцопе може се креирати постављањем кода унутар пар коврчавих заграда. Кад год креирате поље блока, побрините се да Оставите коментар изнад њега тражећи да се протезе оставе саме, тако да нико уклања протезе грешком мислећи да су неки додатни сувишни загради у коду или додајте ознаку у опсег блока.
/ * БЛОК СЦОПЕ, оставите апарате само! * / лет фооВал = 'то је вредност фоо'; вар обј = гет фоо () повратак фооВал; , сет фоо (вал) фооВал = вал фооВал = 'хелло'; // неце утицати на фооВал унутар блока цонсоле.лог (обј.фоо); // "ово је вредност фоо-а"
Промена / креирање фооВал
изван блока неће утицати тхе фооВал
упућени унутар оснивача гетера.
2. Функција сцопинг
Најчешћи начин заштите података са опсегом је чување података унутар функције и повратак објекта са гетерима и сетерима из те функције.
функција миобј () вар фооВал = 'ово је вредност фоо'; ретурн гет фоо () повратак фооВал; , сет фоо (вал) фооВал = вал фооВал = 'хелло'; // неце утицати на нас оригинални фооВал вар обј = миобј (); цонсоле.лог (обј.фоо); // "ово је вредност фоо-а"
Објект (са фоо ()
геттер-сеттер унутар њега) миобј ()
функција је сачувано у обј
, и онда обј
се користи за позвати гутача и сетера.
3. Заштита података без опсега
Постоји још један начин да заштитите своје податке од пребрисања без ограничавања његовог обима. Логика иза тога иде овако: како можете променити део података ако не знате шта се зове?
Ако подаци имају а не тако лако репродуцибилна варијабла / име својства, шансе су да нико (чак и нас) неће завршити преписивањем додељивањем неке вредности том променљивом / својству.
вар обј = с89274934764: 'то је вредност фоо', гет фоо () ретурн тхис.с89274934764; , сет фоо (вал) тхис.с89274934764 = вал; цонсоле.лог (обј.фоо); // "ово је вредност фоо-а"
Видиш, то је један начин да се ствари ријеше. Иако име које сам изабрао није баш добро, можете и ви користите насумичне вредности или симболе да бисте креирали имена некретнина као што је предложио Дерицк Баилеи у овом блогу. Главни циљ је да чувајте податке скривене из другог кода и нека га геттер-сеттер пар приступи / ажурира.
Када треба користити гетерс и сетерс?
Сада долази велико питање: да ли почињете са додељивањем геттера и сетера на све ваше податке Сада?
Ако сте скривање података, онда постоји нема другог избора.
Али ако су ваши подаци видљиви другим кодом је у реду, да ли још увијек требате користити геттерс сетерс само да га повежем са кодом који обавља неке операције на њему? Ја бих рекао да. Код врло брзо се сабира. Креирање микро јединица појединачних података са сопственим геттер-сеттером пружа вам одређену независност рад на наведеним подацима без утјецаја на друге дијелове кода.