get / set
Właściwości obliczane przy odczycie (get) i obsługiwane przy zapisie (set).
Przykład
#const student = {
firstName: 'Anna',
lastName: 'Nowak',
get fullName() {
return `${this.firstName} ${this.lastName}`
},
set fullName(value) {
const [first, last] = value.split(' ')
this.firstName = first
this.lastName = last
}
}
console.log(student.fullName)
student.fullName = 'Ola Kowalska'
console.log(student.firstName)Definicja i zastosowanie
#Gettery i settery pozwalają zdefiniować właściwość, która z zewnątrz wygląda jak zwykłe pole, ale za kulisami wywołuje funkcję. Getter (get) oblicza wartość przy każdym odczycie, a setter (set) reaguje na przypisanie.
Getter świetnie nadaje się do wartości wyliczanych z innych pól, na przykład fullName z imienia i nazwiska. Setter pozwala sprawdzić lub przekształcić przypisywaną wartość, zanim trafi do obiektu.
Zwykle przechowuje się dane w osobnym polu (często z podkreśleniem albo prywatnym #), bo setter zapisujący do tej samej właściwości wywoływałby sam siebie w nieskończoność.
Składnia
#const obj = {
get nazwa() { … },
set nazwa(value) { … }
}Więcej przykładów
#class Player {
#level = 1
get level() {
return this.#level
}
set level(value) {
if (value < 1) throw new RangeError('Poziom musi być dodatni')
this.#level = value
}
}
const player = new Player()
player.level = 5
console.log(player.level)
try {
player.level = 0
} catch (error) {
console.log(error.message)
}Obsługa przeglądarek
#Szeroko dostępne
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Getter nie powinien mieć efektów ubocznych ani wykonywać kosztownych obliczeń, bo wygląda jak zwykły odczyt pola.
- Dane za setterem trzymaj w innym polu, np. prywatnym
#level, inaczej setter wywoła sam siebie.
Powiązane hasła
#- classDefiniuje klasę, czyli szablon do tworzenia obiektów z tymi samymi polami i metodami.
- thisSłowo kluczowe wskazujące obiekt, w kontekście którego wywołano funkcję.
- Object.freeze()Zamraża obiekt, blokując dodawanie, usuwanie i zmianę jego właściwości.
- #polePola i metody z prefiksem # są prywatne: dostęp do nich ma wyłącznie kod wewnątrz klasy.
Widzisz błąd albo brakuje przykładu? Napisz do nas.