Domovská » Kódování » Ultimate Průvodce Getters a Setters v JavaScriptu

    Ultimate Průvodce Getters a Setters v JavaScriptu

    Getry a zřizovatelů jsou funkce nebo metody dostat a soubor hodnoty proměnných. Koncept getter-setteru je běžné v programování počítačůTéměř všechny programovací jazyky na vysoké úrovni jsou dodávány se sadou syntaxí pro implementaci getrů a setterů, včetně JavaScipt.

    V tomto příspěvku uvidíme, co jsou setery setters a jak vytvářet a používat v JavaScriptu.

    Getters-setters a zapouzdření

    Myšlenka getrů a setterů je vždy zmíněna ve spojení s enkapsulací. Zapouzdření může být chápána dvěma způsoby.

    Za prvé, je to zřízení data-getters-setters přístup k datům a jejich úpravu. Tato definice je užitečná, když musí být provedeny některé operace, například validace dat před uložením nebo prohlížením to-getters a setters jsou pro něj ideální domov.

    Za druhé, existuje přísnější definice, podle které se zapouzdření provádí skrýt data, aby byl nepřístupný z jiného kódu, s výjimkou přijímačů a setrů. Takhle nekončíme omylem přepsat důležitá data s nějakým jiným kódem v programu.

    Vytvořit getry a settery

    1. Metody

    Vzhledem k tomu, getters a setters jsou funkce , které přinášejí / mění hodnotu, existují více než jedním způsobem vytvářet a používat. První způsob je:

     var obj = foo: 'toto je hodnota foo', getFoo: function () return this.foo; , setFoo: funkce (val) this.foo = val;  console.log (obj.getFoo ()); // "toto je hodnota foo" obj.setFoo ('hello'); console.log (obj.getFoo ()); // "Ahoj"

    Tohle je nejjednodušším způsobem vytvářet getry a settery. Je tu majetek foo a existují dvě metody: getFoo a setFoo na vrátit a přiřadit hodnotu k tomuto majetku.

    2. S klíčovými slovy

    Další “oficiální” a robustní způsob tvorby getrů a setterů je pomocí dostat a soubor klíčová slova.

    Na vytvořit getter, umístete dostat klíčové slovo před deklarací funkce, která bude sloužit jako metoda getter, a použít soubor klíčové slovo stejným způsobem vytvořit setter. Syntaxe je následující:

     var obj = fooVal: 'toto je hodnota foo', get foo () return this.fooVal; , set foo (val) this.fooVal = val;  console.log (obj.foo); // "toto je hodnota foo" obj.foo = 'hello'; console.log (obj.foo); // "Ahoj" 

    Data mohou být pouze uloženy pod názvem vlastnosti (fooVal) to je odlišný z názvu metody getter-setter (foo), protože majetek drží setr data nelze uchovávat také.

    Kterou cestou je lepší?

    Pokud se rozhodnete vytvořit getry a nastavovače s klíčovými slovy, můžete použít operátor pro nastavení dat a operátora tečky pro získání dat, stejným způsobem byste měli přístup / nastavit hodnotu běžné nemovitosti.

    Pokud se však rozhodnete pro první způsob kódování getrů a nastavovačů, musíte zavolat metody setter a getter pomocí syntaxe volání funkce protože jsou to typické funkce (nic zvláštního jako ty, které byly vytvořeny pomocí dostat a soubor klíčová slova).

    Také je tu šance, že byste mohli skončit omylem přiřazení jiné hodnoty vlastnosti, které držely tyto metody getter-setter a ztratit úplně! V pozdější metodě se nemusíte obávat.

    Takže můžete vidět, proč jsem to řekl druhá technika je robustnější.

    Prevence přepsání

    Pokud z nějakého důvodu dáváte přednost první technice, proveďte nastavení vlastností metody getter-setter pouze ke čtení vytvořením použitím Object.defineProperties. Vlastnosti vytvořené přes Object.defineProperties, Object.defineProperty a Reflect.defineProperty automaticky konfigurovat na zapisovatelný: false což znamená pouze ke čtení:

     / * Přepsat prevenci * / var obj = foo: 'toto je hodnota foo'; Object.defineProperties (obj, 'getFoo': hodnota: function () return this.foo;, 'setFoo': value: function (val) this.foo = val;); obj.getFoo = 66; // getFoo nebude přepsán! console.log (obj.getFoo ()); // "toto je hodnota foo" 

    Operace uvnitř getrů a setterů

    Jakmile jste zavedli getry a setery, můžete pokračovat a provádět operace s daty před změnou nebo vrácením.

    V níže uvedeném kódu jsou ve funkci getter data spojen s řetězcem před vrácením, a ve funkci setter validace zda hodnota je číslo nebo ne se provádí před aktualizací n.

     var obj = n: 67, get id () return 'ID je:' + this.n; , set id (val) if (typeof val === 'number') this.n = val;  console.log (obj.id); // "ID je: 67" obj.id = 893; console.log (obj.id); // "ID je: 893" obj.id = 'hello'; console.log (obj.id); // "ID je: 893" 

    Chraňte data pomocí getrů a nastavovačů

    Doposud jsme se zabývali použitím getrů a setrů v prvním kontextu zapouzdření. Přejdeme k druhému, tj. Jak skrýt data z vnějšího kódu s pomocí getrů a setterů.

    Nechráněná data

    Nastavení getrů a nastavovačů neznamená, že k datům lze přistupovat a měnit je pouze těmito metodami. V následujícím příkladu je to přímo změněna bez dotyku metod getter a setter:

     var obj = fooVal: 'toto je hodnota foo', get foo () return this.fooVal; , set foo (val) this.fooVal = val;  obj.fooVal = 'hello'; console.log (obj.foo); // "Ahoj" 

    Nepoužívali jsme setter, ale přímo změnila data (fooVal). Data, která jsme původně nastavili uvnitř obj je teď pryč! Aby se tomu zabránilo (náhodně), vy potřebují určitou ochranu pro vaše data. Můžete to přidat omezení kde jsou vaše údaje k dispozici. Můžete to udělat jedním z nich blokování rozsahu nebo funkce scoping.

    1. Blokování rozsahu

    Jedním ze způsobů je použít rozsah bloků uvnitř kterého budou data definována pomocí nechat klíčové slovo, které jeho rozsah k tomuto bloku.

    A rozsahu bloků lze vytvořit umístěním kódu uvnitř dvojice složených závorek. Vždy, když vytvoříte rozsah bloků, ujistěte se, že Zanechat komentář nad ní žádají, aby šle zůstaly samy, takže nikdo odstraní rovnátka omylem si myslí, že jsou v kódu nebo nadbytečné závorky přidat štítek do rozsahu bloků.

     / * BLOCK SCOPE, nechte závorky sám! * / let fooVal = 'toto je hodnota foo'; var obj = get foo () return fooVal; , set foo (val) fooVal = val fooVal = 'hello'; // neovlivní fooVal uvnitř bloku console.log (obj.foo); // "toto je hodnota foo"

    Změna / vytvoření fooValmimo blok neovlivní fooVal uvedené uvnitř setters setters.

    2. Rozsah funkce

    Běžnější způsob ochrany dat s rozsahem je uchovávání dat uvnitř funkce a vrácení objektu s getry a settery z této funkce.

     function myobj () var fooVal = 'toto je hodnota foo'; return get foo () return fooVal; , set foo (val) fooVal = val fooVal = 'hello'; // neovlivní náš původní fooVal var obj = myobj (); console.log (obj.foo); // "toto je hodnota foo"

    Objekt (s foo () getter-setter uvnitř)) myobj () funkce je uloženy v obj, a pak obj je zvyklý zavolat getter a setter.

    3. Ochrana údajů bez určení rozsahu

    K dispozici je také jiný způsob, jak chránit svá data před přepsáním jeho rozsah. Logika za tím jde takto: jak můžete změnit data, pokud nevíte, co se nazývá?

    Pokud mají data a není tak snadno reprodukovatelný název proměnné / vlastnosti, šance, že se nikdo (ani my) neskončí přepsáním přiřazením nějaké hodnoty této proměnné / názvu vlastnosti.

     var obj = s89274934764: 'toto je hodnota foo', get foo () return this.s89274934764; , set foo (val) this.s89274934764 = val;  console.log (obj.foo); // "toto je hodnota foo" 

    Vidíte, to je jeden způsob, jak to zvládnout. Ačkoli jméno, které jsem si vybral, není opravdu dobré, můžete také používat náhodné hodnoty nebo symboly vytvořit názvy nemovitostí, jak to navrhuje Derick Bailey v tomto blogu. Hlavním cílem je uchovávat data skrytá z jiných kódů a nechat getter-setter pár přístup / aktualizovat.

    Kdy byste měli používat getry a settery?

    Nyní přichází velká otázka: začnete přiřazovat getry a setery všech vašich dat Nyní?

    Pokud jsi skrytí dat, pak je tu žádná jiná volba.

    Ale pokud vaše data jsou viděny jiným kódem je v pořádku, stále potřebujete používat setters setters jen sbalit s kódem které na něm provádí nějaké operace? řekl bych Ano. Kód velmi brzy. Vytváření mikro jednotek jednotlivých dat s vlastním setterem vám poskytuje určitou nezávislost pracovat na uvedených údajích bez ovlivnění ostatních částí kódu.