static
Oznacza pole lub metodę należącą do samej klasy, a nie do obiektów tworzonych przez new.
Przykład
#class Student {
static count = 0
constructor(name) {
this.name = name
Student.count++
}
static compare(a, b) {
return a.name.localeCompare(b.name, 'pl')
}
}
const students = [new Student('Ola'), new Student('Ania'), new Student('Łukasz')]
console.log(Student.count)
console.log(students.toSorted(Student.compare).map((student) => student.name))
console.log(students[0].count)Instancja nie ma pola count. Należy ono do klasy, więc odczytasz je tylko przez Student.count.
Definicja i zastosowanie
#Słowo static przed polem lub metodą sprawia, że należy ona do klasy, a nie do jej instancji. Odwołujesz się do niej przez nazwę klasy, tak jak w Math.max() czy Array.from(), bez tworzenia obiektu. Instancje nie mają dostępu do składowych statycznych przez this.
Metody statyczne to dobre miejsce na funkcje związane z klasą, które nie potrzebują danych konkretnego obiektu: metody fabryczne tworzące instancje w określony sposób (Course.fromJSON()), walidatory czy funkcje porównujące dwie instancje. Pola statyczne przechowują dane wspólne dla całej klasy, np. licznik utworzonych obiektów albo stałe konfiguracyjne.
Wewnątrz metody statycznej this wskazuje na klasę, więc możesz odwoływać się do innych składowych statycznych. Są one dziedziczone przez klasy pochodne. Blok static { } uruchamia kod jeden raz, podczas definiowania klasy, np. żeby przygotować bardziej złożone pole statyczne.
Składnia
#class Name {
static field = value
static #privateField = value
static method() {}
static {
// kod uruchamiany raz przy definicji klasy
}
}
Name.method()
Name.fieldWięcej przykładów
#class Course {
constructor(title, lessons) {
this.title = title
this.lessons = lessons
}
static fromJSON(json) {
const data = JSON.parse(json)
return new Course(data.title, data.lessons)
}
}
const course = Course.fromJSON('{"title":"React","lessons":16}')
console.log(course)
console.log(course instanceof Course)class Character {
static create(name) {
return new this(name)
}
constructor(name) {
this.name = name
}
}
class Guide extends Character {}
console.log(Character.create('Astro'))
console.log(Guide.create('Ra'))Klasa Guide odziedziczyła metodę create(). Wywołana jako Guide.create() ma this równe Guide, więc tworzy obiekt właściwej klasy.
class Levels {
static thresholds = []
static {
for (let level = 1; level <= 5; level++) {
Levels.thresholds.push(level * level * 100)
}
}
}
console.log(Levels.thresholds)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
#- Jeśli metoda nie korzysta z danych instancji, zastanów się, czy nie powinna być statyczna albo zwykłą funkcją poza klasą.
- W konstruktorze i metodach instancji odwołuj się do pola statycznego przez nazwę klasy, np.
Student.count. Zapisthis.countszuka pola w obiekcie, a nie w klasie. - Metodę statyczną używającą
thisprzekazuj jako callback ostrożnie. Oderwana od klasy stracithis, tak jak zwykłe metody.
Powiązane hasła
#- classDefiniuje klasę, czyli szablon do tworzenia obiektów z tymi samymi polami i metodami.
- extendsTworzy klasę pochodną, która dziedziczy metody innej klasy i może je rozszerzać lub nadpisywać.
- superOdwołuje się do klasy bazowej: wywołuje jej konstruktor albo jej wersję metody.
- #polePola i metody z prefiksem # są prywatne: dostęp do nich ma wyłącznie kod wewnątrz klasy.
- thisSłowo kluczowe wskazujące obiekt, w kontekście którego wywołano funkcję.
Widzisz błąd albo brakuje przykładu? Napisz do nas.