MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/8d22564490d8

getter

To tłumaczenie jest niekompletne. Pomóż przetłumaczyć ten artykuł z języka angielskiego.

Składnia get łączy właściwość obiektu z funkcją, która będzie wykonywana za każdym razem, kiedy ta właściwość jest wywoływana.
 

Składnia

{get prop() { ... } }
{get [expression]() { ... } }

Parametry

prop
Nazwa właściwości, która łączy ją z okresloną funkcją.
expression
Począwszy od ECMAScript 2015, można również użyć wyrażeń w celu połaczenia funkcji z nazwą właściwości, która jest obliczana.

Opis

Czasami pożądane jest aby umożliwić dostęp do właściwości, która zwraca wartość obliczaną dynamicznie lub potrzeba odzwierciedlić stan jakiejś wewnętrznej zmiennej bez potrzeby użycia wyraźnego wywołania metody. W języku JavaScript może to być osiągnięte dzięki użyciu getter'a. Nie jest możliwe jednocześnie mieć getter połączony z właściwością i mieć tą właściwość (o takiej samej nazwie jak getter), która faktycznie trzyma wartość. Jednakże jest możliwe aby używać połączenia getter'a i setter'a, żeby utworzyć rodzaj pseudo-właściwości.

Zauważ, że gdy pracujemy ze składnią get to:

Getter może być usunięty poprzez operator delete.

Przykłady

Definiowanie gettera na nowym obiekcie w inicjalizatorze obiektu.

To stworzy pseudo-właściwość latest dla objektu obj, która zwróci ostatnio zalogowany element w tablicy log.

var obj = {
  log: ['test'],
  get latest() {
    if (this.log.length == 0) return undefined;
    return this.log[this.log.length - 1];
  }
}
console.log(obj.latest); // Zwróci "test".

Zauważ, że usiłowanie przypisania wartości do latest nie zmieni jej.

Usuwanie gettera używając operatora delete

Jeśli chcesz usunąć getter, wystarczy użycie delete na tej nim:

delete obj.latest;

Definiowanie gettera na istniejącym obiekcie uzywając defineProperty

Aby dołączyć getter do istniejącego obiektu, można w każdej chwili użyć:
Object.defineProperty().

var o = {a: 0};

Object.defineProperty(o, 'b', { get: function() { return this.a + 1; } });

console.log(o.b) // Uruchamia getter, który otrzymuje yields a + 1 (which is 1)

Używanie obliczanych wartości dla właściwości.

var expr = 'foo';

var obj = {
  get [expr]() { return 'bar'; }
};

console.log(obj.foo); // "bar"

Bystre / samo-nadpisujące / leniwe getter'y

Getter'y dają ci możliwośc zdefiniowania właściwości obiektu, ale nie obliczają wartości właściwości dopóki nie jest ona dostępna. Getter odracza koszt obliczania wartości dopóki ta wartość jest potrzebna, a jeśli nigdy nie jest potrzebna, nie ponosi się tego kosztu.

Dodatkową techniką optymalizacyjna aby uleniwić lub opóźnić obliczanie wartości dla właściwości jak i przechować ją na później są bystre (smart) lub zmemoizowane getter'y. Wartość jest obliczana gdy getter jest wywoływany za pierwszym razem, a potem jest przechowywana więc kolejne dostępy zwracają zbuforowaną wartość bez jej ponownego obliczania. Jest to użyteczne w następujących sytuacjach:

  • Jeśli obliczanie wartości dla właściwości jest kosztowne (wymaga zużycia dużych zasobów pamięci operacyjnej RAM lub czasu procesora, itd).
  • Jesli wartość nie jest potrzebna natychmiast. Będzie jednak używana później lub w pewnych przypadkach nie będzie użyta wcale.
  • Jeżeli jest użyta, będzie wykorzystywana wiele razy i nie ma potrzeby ponownego jej oblczania, oraz jej wartość nigdy nie będzie zmieniona lub ponownie obliczana.

To oznacza, że nie powinno się używać leniwych getter'ów dla właściwości, której wartość może ulec zmianie, ponieważ taki getter nie oblicza właściwości ponownie.

W następującym przykładzie objekt posiada getter jako swoją właściwość. Otrzymując tą właściwość, jest ona usuwana z obiektu i ponownie dodawana, ale niejawnie jako właściwość z przypisanymi danymi. W ostatecznym rozrachunku zwracana jest wartość.

get notifier() {
  delete this.notifier;
  return this.notifier = document.getElementById('bookmarked-notification-anchor');
},

Na potrzeby kodu Firefox'a, zobacz również moduł z kodem XPCOMUtils.jsm, który okresla funkcje defineLazyGetter().

Specyfikacje

Specyfikacje Status Comment
ECMAScript 5.1 (ECMA-262)
The definition of 'Object Initializer' in that specification.
Standard Initial definition.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Method definitions' in that specification.
Standard Added computed property names.
ECMAScript 2017 Draft (ECMA-262)
The definition of 'Method definitions' in that specification.
Draft  

Zgodność z przeglądarkami

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 1 2.0 (1.8.1) 9 9.5 3
Computed property names 46 34 (34) No support No support No support
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) 1.0 (1.8.1) (Yes) (Yes) (Yes)
Computed property names 47 No support 34.0 (34.0) No support No support No support

Zobacz również

Autorzy i etykiety dokumentu

 Autorzy tej strony: broslukasz
 Ostatnia aktualizacja: broslukasz,