Objekty v JavaScriptu

SnoopySnoopy

Javascript lze považovat za objektově orientovaný jazyk, což znamená, že je založen na konceptu objektů, jejich vlastnostech a metodách.

Pokud bychom chtěli být přesnější, pak řekneme, že je prototypovým jazykem. To znamená, že nám dovoluje vytvářet nové objekty a třídy, aniž by bylo nutné definovat jejich schéma či strukturu předem. K tomu využívá prototypy jiných objektů a tříd, což umožňuje snadnou extenzibilitu a flexibilitu.

Není to tak dávno, co JavaScript dokonce začal podporovat třídy vrámci verze ECMAScript2015 (ES6). Mnoho programátorů třídy dobře zná z jiných programovacích jazyků.

Objekt je datový typ, který má podobu dynamické kolekce vlastností. Každá vlastnost se skládá ze dvou částí: klíče a hodnoty. Klíče mohou být řetězce nebo hodnoty typu symbol a hodnoty mohou být libovolné datové typy, tedy třeba funkce, pole, samotný objekt nebo jakýkoli primitivní datový typ.

Příklad ne moc obvyklé definice klíče pomocí symbolu.

const sym = Symbol('neco');
const obj = {
	[sym]: 123
}

Inicializace a deklarace objektu

V JavaScriptu můžete vytvořit objekt pomocí konstruktoru objektu nebo pomocí tzv. literalní notace objektu.

Notace object literal

Tento způsob inicializace je nejsnadnější. Chcete-li vytvořit objektový literál, jednoduše zadáte identifikátor a přiřadíte mu objekt jako hodnotu.

var obj = { };

Je to rychlý způsob, jak vytvořit malý objekt s několika vlastnostmi. Takto automaticky vytvořený objekt automaticky dědí z Object.prototype.

Inicializace objektu s vlastnostmi a jejich hodnotami, které jsou čárkami odděleným seznamem uzavřeným do složených závorek ().

var obj = { foo: true, bar: 1 };

Pomocí Object.create

Object.create^oc je statická metoda, která nám dovoluje definovat více výchozích možností které vytvořený objekt bude mít. Pakliže chceme sami definovat z jakého objektu se nově vytvořený bude dědit a ještě si pohrát s vlastnostmi objektu, pak je použítí této metody na místě.

var objektA = Object.create({})

Pomocí klíčového slova new

Na další způsob je zvyklá řada programátorů z jazyků jako Java, C++ nebo PHP, kde používá klíčové slovo new k vytváření nové instance objektu ^new.

Při použití klíčového slova new se vytvoří nový objekt, který má jako prototyp prototyp dané třídy, a poté se volá konstruktor třídy s novým objektem jako kontextem volání a s libovolnými argumenty, které byly předány konstruktoru.

var objektC = new Object();

Vytvoření vlastnosti (členské proměnné)

Téměř každý objekt, který vytvoříte, se neobejde bez členských proměnných, tzn. nějakým popisem vlastností objektu. Pro definování vlastností objektu při jeho vytváření se používá tzv. "shorthand notation".

var obj = { vlastnost: "hodnota" };

Vlastnost může být vlastní nebo zděděná z rodičovského objektu.

Vlastnosti jsou dynamické. To v tomto případě znamená, že je lze kdykoli vytvořit nebo odstranit.

Přístup ke členským proměnným

Existují dva způsoby, jak získat přístup k vlastnostem objektu.

Tečkový zápis:. Značka závorky: []

Vlastnosti jsou dynamické. To znamená, že je lze kdykoli vytvořit nebo odstranit, také nejsou omezeny žádným předem stanoveným seznamem nebo schématem. V některých jazycích, jako je například Java nebo C#, jsou členské proměnné objektu pevně stanovené a musí být definovány předem, před vytvořením objektu.

Prototype

Dalším ze způsobů, jak vytvořit objekty v JavaScriptu, je použití konstruktoru funkce.

Proměnné deklarované uvnitř funkce se nachází v prototypu (__proto__), nikoli v instanci objektu. To je poměrně důležité, protože kdybychom měli tisíc instancí objektu, mohly by všechny sdílet odkaz na stejnou metodu, místo aby bylo všude deset tisíc kopií těchto metod.

Když je tento objekt vytvořen, JavaScript přidá vlastnost __proto__ do nově vytvořeného objektu, který se nazývá dunder proto. dunder proto nebo __proto__ ukazuje na prototypový objekt funkce konstruktoru.

(function() {}) instanceof Object

new Boolean(true) instanceof Object

Dědičnost prototypů

Tedy dědičnost funguje trochu jinak než u jazyků jako je Ruby, Python, Java, PHP, Scala atd.^1. Javascript používá prototypovou dědičnost místo klasických tříd.

Konverze typů

Někdy bychom chtěli používat operátory i s objekty. Javascript nám nedovoluje přetěžovat operátory, nicméně nám dovoluje využít abstraktních metody ke konverzi objektu na primitivní datový typ.

Ovlivňen

V tomto byl dost možná ovlivněn jazykem Self se kterým sdílí mnoho společných rysů (dynamické typování, interpretovaný), včetně objektového modelu, který je založený na prototypech.