getter
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 gettera. 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 gettera i settera, żeby utworzyć rodzaj pseudo-właściwości.
Zauważ, że gdy pracujemy ze składnią get to:
- Można mieć identyfikator, który jest zarówno typu number jak i string;
- Obowiązkowe jest aby zawierała dokładnie zero parametrów (zobacz: "Niekompatybilna zmiana ES5: literał dla funkcji gettera i setera muszą teraz mieć dokładnie zero albo jeden argumentów", aby uzyskać więcej informacji)
- Nie może pojawiać się w literale obiektu z innym getem lub właściwością o takich samych nazwach (
{ get x() { }, get x() { } }
oraz{ x: ..., get x() { } }
są niedozwolone).
Getter może być usunięty poprzez operator delete
.
Przykłady
Definiowanie gettera na nowym obiekcie w inicjalizatorze obiektu.
To stworzy pseudowłaściwość latest
dla obiektu 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żyć delete
:
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 gettery
Gettery 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 gettery. 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 obiekt 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 Firefoxa, 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 (ECMA-262) The definition of 'Method definitions' in that specification. |
Living Standard |
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ż
- setter
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- Defining Getters and Setters in JavaScript Guide