static

Marque un champ ou une méthode comme appartenant à la classe elle-même, et non aux objets créés avec new.

Sur cette page

Exemple

#
JavaScript
class Student {
  static count = 0

  constructor(name) {
    this.name = name
    Student.count++
  }

  static compare(a, b) {
    return a.name.localeCompare(b.name, 'fr')
  }
}

const students = [new Student('Lucas'), new Student('Emma'), new Student('Léa')]

console.log(Student.count)
console.log(students.toSorted(Student.compare).map((student) => student.name))
console.log(students[0].count)
Console
3
['Emma', 'Léa', 'Lucas']
undefined

L’instance n’a pas de champ count. Il appartient à la classe, donc vous ne pouvez le lire que via Student.count.

Définition et utilisation

#

Le mot static devant un champ ou une méthode fait qu’il appartient à la classe, et non à ses instances. Vous y accédez par le nom de la classe, comme avec Math.max() ou Array.from(), sans créer d’objet. Les instances n’ont pas accès aux membres statiques via this.

Les méthodes statiques sont un bon endroit pour des fonctions liées à la classe qui n’ont pas besoin des données d’un objet précis : des méthodes fabriques qui créent des instances d’une façon particulière (Course.fromJSON()), des validateurs, ou des fonctions qui comparent deux instances. Les champs statiques stockent des données communes à toute la classe, par exemple un compteur d’objets créés ou des constantes de configuration.

À l’intérieur d’une méthode statique, this désigne la classe, vous pouvez donc faire référence aux autres membres statiques. Ils sont hérités par les classes dérivées. Un bloc static { } exécute du code une seule fois, pendant la définition de la classe, par exemple pour préparer un champ statique plus complexe.

Syntaxe

#
Syntaxe
class Name {
  static field = value
  static #privateField = value

  static method() {}

  static {
    // code exécuté une fois, lors de la définition de la classe
  }
}

Name.method()
Name.field

Plus d’exemples

#
Une méthode fabrique
JavaScript
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)
Console
Course { title: 'React', lessons: 16 }
true
this dans une méthode statique et l’héritage
JavaScript
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'))
Console
Character { name: 'Astro' }
Guide { name: 'Ra' }

La classe Guide a hérité de la méthode create(). Appelée comme Guide.create(), this équivaut à Guide, donc elle crée une instance de la bonne classe.

Bloc static
JavaScript
class Levels {
  static thresholds = []

  static {
    for (let level = 1; level <= 5; level++) {
      Levels.thresholds.push(level * level * 100)
    }
  }
}

console.log(Levels.thresholds)
Console
[100, 400, 900, 1600, 2500]

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Si une méthode n’utilise aucune donnée de l’instance, demandez-vous si elle ne devrait pas être statique, ou simplement une fonction ordinaire hors de la classe.
  • Dans le constructeur et les méthodes d’instance, référez-vous à un champ statique par le nom de la classe, par exemple Student.count. L’écriture this.count cherche un champ sur l’objet, pas sur la classe.
  • Transmettez avec prudence une méthode statique qui utilise this comme callback. Détachée de la classe, elle perd this, tout comme les méthodes ordinaires.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.