syntax získat spojuje vlastnost objektu s funkcí, která bude volána při přístupu k této vlastnosti.
Interaktivní příklad
syntax
Parametry
Název vlastnosti, která se má svázat s danou funkcí.
Počínaje ECMAScriptem 6 můžete také použít vypočítané výrazy názvu vlastnosti k navázání na danou funkci.
popis
Někdy chcete povolit přístup k vlastnosti, která vrací dynamicky vypočítanou hodnotu, nebo můžete chtít odrážet stav interní proměnné, aniž byste museli používat explicitní volání metody. V JavaScriptu to lze provést pomocí getter.
Není možné, aby byl getter navázán na vlastnost a aby tato vlastnost skutečně obsahovala hodnotu, ačkoli můžete použít getter a setter v kombinaci k vytvoření typu pseudovlastnosti.
Při práci se syntaxí get zvažte následující:
- Může mít identifikátor, který je buď číslo, nebo řetězec;
- Musí mít přesně nula nebo jeden argument (viz Nekompatibilní změna ES0: funkce doslovného získávání a nastavení musí mít nyní přesně nula nebo jeden argument pro více informací);
- Nesmí se objevit v objektovém literálu společně s jiným get nebo prostřednictvím vstupu pro stejnou vlastnost ( , get x() > a > jsou zakázány) .
Getter lze odstranit pomocí operátoru delete.
Příklady
Definování getru na novém objektu v době inicializace tohoto objektu
Níže vytvoříme nejnovější pseudovlastnost pro objekt obj, která vypíše poslední prvek pole do konzoly protokolu.
const obj = přihlásit: ["příklad", "test"], získat poslední() if (tento.přihlásit.délka === ) zpáteční nedefinované; zpáteční tento.přihlásit[tento.přihlásit.délka - 1]; >, >; konzole.přihlásit(Obj.poslední); // "test"
Pamatujte, že pokus o přiřazení hodnoty nejnovější ji nezmění.
Odstranění getteru pomocí operátoru delete
Pokud chcete getter smazat, použijte delete :
smazat obj.poslední;
Definování getru na již existujících objektech pomocí defineProperty
Chcete-li kdykoli přidat getter k existujícímu objektu, použijte Object.defineProperty().
konst o = a: >; Objekt.definovatVlastnost(o, "b", získat: funkce () zpáteční tento.a + 1; >, >); konzole.přihlásit(o.b); // Spustí getter, který dává + 1 (což je 1)
Použití vypočítané pojmenované vlastnosti
Poznámka: Vypočítané vlastnosti jsou experimentální technologií, která je součástí návrhů specifikace ECMAScript 6 a prohlížeče je zatím široce nepodporují. Níže uvedený kód způsobí chybu syntaxe v nepodporovaných prostředích.
var expr = "foo"; byl Obj = získat [expr]() zpáteční "bar"; >, >; konzole.přihlásit(Obj.Foo); // "bar"
Chytré/samopřepisující/líné getry
Gettery nám dávají možnost definovat vlastnost objektu, ale nevyhodnocují hodnotu této vlastnosti, dokud není k dispozici. Getter odkládá náklady na výpočet hodnoty, dokud není hodnota potřebná, a pokud není nikdy potřeba, pak nikdy nezaplatíte.
Další optimalizační technikou je být líný nebo odložit výpočet hodnoty vlastnosti a uložit ji do mezipaměti pro pozdější přístup. To oni dělají chytré nebo paměťové getry. Hodnota se vypočítá při prvním volání getteru a poté se uloží do mezipaměti, takže následná volání vrátí hodnotu uloženou v mezipaměti, aniž by se přepočítala. To je užitečné v následujících situacích:
- Pokud je výpočet hodnoty vlastnosti drahý (zabírá hodně paměti RAM nebo CPU, vytváří pracovní vlákno, načítá vzdálený soubor atd.).
- Pokud tato hodnota nyní není potřeba. Bude použit později, nebo v některých případech není použit vůbec.
- Pokud je použit, bude přístupný několikrát a není třeba jej přepočítávat, protože hodnota se nezmění, nebo by se neměla přepočítávat.
To znamená, že pro vlastnost, jejíž hodnotu se chystáte změnit, nemusíte používat líný getr, protože getter hodnotu nepřepočítá.
V následujícím příkladu má objekt getter jako svou vlastní vlastnost. Když je vlastnost načtena, vlastnost je z objektu odstraněna a přidána znovu, ale tentokrát implicitně, jako vlastnost data. V důsledku toho je vrácena hodnota.
získat oznamovatele() vymazat tento.oznamovatele; zpáteční tento.oznamovatele = dokument.getElementById("bookmarked-notification-anchor"); >,
Pro Firefox viz také modul XPCOMUtils.jsm, který definuje funkci defineLazyGetter().
získat a definovatVlastnost
Použití klíčového slova get a Object.defineProperty() poskytuje podobné výsledky, ale při použití ve třídách je mezi nimi nepatrný rozdíl.
Při použití get bude vlastnost definována v prototypu objektu, zatímco při použití Object.defineProperty() bude vlastnost definována v instanci, na kterou je aplikována.
třída Příklad získat ahoj() zpáteční "svět"; > > const Obj = nový Příklad(); konzole.přihlásit(Obj.ahoj); // "svět" konzole.přihlásit(Objekt.getOwnPropertyDescriptor(Obj, "Ahoj")); //nedefinováno konzole.přihlásit( Objekt.getOwnPropertyDescriptor(Objekt.getPrototypeOf(Obj), "Ahoj"), ); // , sada: nedefinováno >
Specifikace
specifikace |
---|
Specifikace jazyka ECMAScript # sek-metoda-definice |
Kompatibilita prohlížeče
BCD tabulky se načítají pouze v prohlížeči
viz též
- setr
- vymazat
- Object.defineProperty()
- Object.prototype.__defineGetter__()
- Object.prototype.__defineSetter__()
- Definování Getterů a Setterů v JavaScript Guide
Našli jste na této stránce problém s obsahem?
- Upravte stránku na GitHubu.
- Nahlaste problém s obsahem.
- Podívejte se na zdroj na GitHubu.
Tato stránka byla naposledy upravena 4. srpna 2023 od přispěvatelů MDN.
Váš plán pro lepší internet.