TOC

This article has been localized into Czech by the community.

Objekty:

Přístupové metody k vlastnostem (gettery a settery)

Již jsme diskutovali o vlastnostech objektů a o tom, jak jsou užitečné. Ve výchozím nastavení jsou zcela přístupné spotřebiteli objektu, a i když tvůrcem a spotřebitelem objektu bude často stejná osoba, někdy tomu tak není.

Když vystavujete objekt k použití jinými programátory, může být velmi užitečné více ovládat, jak lze vlastnost používat. K tomu můžeme použít přístupové metody k vlastnostem, často označované jako gettery a settery.

Když mluvíme o přístupových metodách k vlastnostem, nebo o getterech a setterech, ve skutečnosti mluvíme o metodách. Jsou to však speciální metody, které se budou jevit jako vlastnosti, zatímco vám umožní provést další zpracování před přiřazením a/nebo vrácením hodnoty vlastnosti. Zvažte tento běžný příklad objektu s vlastnostmi:

let user = 
{
	name: "John Doe",
	age: 42	
};

Definuje dvě vlastnosti, jméno a věk, které jsou zcela přístupné spotřebiteli objektu - mohou tyto vlastnosti číst a zapisovat, jak chtějí, bez jakýchkoli kontrol nebo logiky aplikované na proces. Pojďme to změnit.

getters

Nejprve se podívejme, jak fungují gettery. Jak bylo zmíněno, gettery a settery jsou jen funkce/metody, ale používají speciální klíčová slova get a set ke změně jejich chování z běžných metod na gettery a settery. Pojďme přidat getter do našeho objektu:

let user = 
{
	_name: "John Doe",
	age: 42,
	
	get name()
	{
		return this._name;
	}
};

alert(user.name);

Nyní jsem přidal velmi jednoduchý getter nazvaný name, který bude jen vracet hodnotu vlastnosti _name. Všimněte si, že i když to vypadá jako funkce, lze na ni odkazovat jako na vlastnost, jak je vidět z posledního řádku příkladu.

setters

V příkladu výše jsme ještě nedefinovali setter pro vlastnost name. To v podstatě znamená, že hodnotu nelze zvenčí objektu změnit - pokud to zkusíte, uvidíte, že se nic nezmění, jak ilustruje tato upravená verze prvního příkladu:

let user = 
{
	_name: "John Doe",
	age: 42,
	
	get name()
	{
		return this._name;
	}
};
user.name = "test";
// John Doe - the property was not changed
alert(user.name);

Nyní to změňme přidáním setteru do objektu. Jak vidíte, vypadá to jako getter, ale používá klíčové slovo set místo get a pak bere parametr - JavaScript automaticky naplní tento parametr vždy, když se pokusíte přiřadit hodnotu k vlastnosti:

let user = 
{
	_name: "John Doe",
	age: 42,
	
	get name()
	{
		return this._name;
	},
	
	set name(val)
	{
		this._name = val;
	}
};
user.name = "test";
// test
alert(user.name);

Nyní můžeme změnit hodnotu vlastnosti, ale zatím jsme ve srovnání s běžnými vlastnostmi nezavedli žádnou skutečnou funkcionalitu. Přidejme nějakou logiku do našich speciálních metod.

Přidávání logiky

Nyní jsme viděli jednoduché příklady jak getterů, tak setterů, ale jak bylo zmíněno, skutečnou výhodou používání přístupových metod k vlastnostem, nebo getterů a setterů, je fakt, že získáváme větší kontrolu nad vstupem a výstupem. S tímto na mysli bych vám chtěl ukázat úplnější příklad objektu s getterem a setterem, který vám poskytne lepší představu o tom, čeho lze dosáhnout:

let user = 
{
	_name: "joHn dOE",
	age: 42,
	
	get name()
	{
		let arr = this._name.split(' ');
		arr = arr.map(function(part)
		{
			return part.charAt(0).toUpperCase() + part.slice(1).toLowerCase();
		});
		return arr.join(" ");
	},
	
	set name(val)
	{
		val = val.trim();
		if(val == '')
			alert("Empty value not allowed!");
		else
			this._name = val;
	}
};

//joHn dOE -> John Doe
alert(user.name);
user.name = prompt("Enter new name:");
alert(user.name);

Především si všimněte, jak jsem nyní narušil psaní velkých a malých písmen u jména uchovávaného ve vlastnosti _name (joHn dOE). Abychom se vypořádali se situacemi jako je tato, v našem getteru nyní rozdělujeme jméno na části a zajistíme, že každá část jména je psána malými písmeny, kromě prvního znaku, který je psán velkým písmenem - jinými slovy, náš getter nyní správně formátuje jméno tak, jak bychom očekávali, že bude vypadat. To je skvělý příklad toho, jak můžete používat gettery k získání větší kontroly nad vlastnostmi vašeho objektu.

Přepsal jsem také setter, aby prováděl velmi základní ověření - v tomto okamžiku pouze zajišťuje, že vlastnosti nejsou přiřazeny žádné prázdné hodnoty, ale to by samozřejmě mohlo být rozšířeno o další případy. Pokud je předána prázdná hodnota, je vyvolána chyba a vlastnost není nastavena - to můžete vyzkoušet při spuštění příkladu.

Soukromé vlastnosti

Nejchytřejší čtenáři tohoto článku by mohli položit velmi relevantní otázku: Co brání spotřebiteli objektu jednoduše přistupovat k vlastnosti _name a tím obejít logiku aplikovanou v getteru a setteru name? V tomto případě je odpověď bohužel: Nic.

JavaScript skutečně nabízí koncept soukromých vlastností, ale pouze pro třídy - u objektů je vše ve výchozím nastavení veřejné a nemůže být nastaveno jako soukromé. Nicméně v JavaScriptu, stejně jako v některých dalších programovacích jazycích, existuje obecně přijímané nepsané pravidlo, které uvádí, že vlastnosti začínající podtržítkem by měly být považovány za interní a neměly by být přímo přístupné.

Pokud tedy definujete gettery a settery pro existující vlastnost na objektu, nechte název základní vlastnosti začínat podtržítkem, abyste spotřebiteli naznačili, že k této konkrétní vlastnosti by neměl přistupovat přímo.

Shrnutí

Přístupové metody k vlastnostem, běžně označované jako gettery a settery, vám umožňují plně ovládat vlastnosti objektu. Protože gettery a settery jsou funkce/metody, můžete přidat logiku do procesu čtení/zápisu vlastnosti, ale zvenčí můžete stále přistupovat k hodnotě, jako by to byla běžná vlastnost.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!