Для того, чтобы объявить статический метод класса, необходимо использовать ключевое слово static.

Синтаксис

static methodName() { ... }

Описание

Cтатические методы вызываются через имя класса. Вызывать статические методы через имя объекта запрещено. Статические методы часто используются для создания вспомогательных функций приложения.

Вызов статических методов

Вызов из другого статического метода

Чтобы вызвать статический метод в другом статическом методе того же класса, вы можете использовать ключевое слово this.

class StaticMethodCall {
  static staticMethod() {
    return 'Вызван статический метод';
  }
  static anotherStaticMethod() {
    return this.staticMethod() + ' из другого статического метода';
  }
}
StaticMethodCall.staticMethod(); 
// 'Вызван статический метод'

StaticMethodCall.anotherStaticMethod(); 
// 'Вызван статический метод из другого статического метода'

Вызов из конструктора класса и других методов

Статические методы недоступны напрямую, используя ключевое слово this из нестатических методов. Вам нужно вызвать их с помощью имени класса: CLASSNAME.STATIC_METHOD_NAME() или вызовом метода как свойства конструктора: this.constructor.STATIC_METHOD_NAME().

class StaticMethodCall {
  constructor() {
    console.log(StaticMethodCall.staticMethod()); 
    // 'вызван статический метод.' 

    console.log(this.constructor.staticMethod()); 
    // 'вызван статический метод.' 
  }

  static staticMethod() {
    return 'вызван статический метод.';
  }
}

Примеры

Следующий пример демонстрирует:

  1. Как статический метод реализуется в классе.
  2. Как его переопределить статический метод при наследовании.
  3. Как можно и как нельзя вызывать статические методы.
class Triple {
  static triple(n) {
    if (n === undefined) {
      n = 1;
    }
    return n * 3;
  }
}

class BiggerTriple extends Triple {
  static triple(n) {
    return super.triple(n) * super.triple(n);
  }
}

console.log(Triple.triple());        // 3
console.log(Triple.triple(6));       // 18

var tp = new Triple();

console.log(BiggerTriple.triple(3));
// 81 (не затрагивается экземпляром родителя)

console.log(tp.triple());
// Выведет сообщение, что "tripple" не является
// функцией ('tp.tripple is not a function').

Спецификации

Спецификация Статус Комментарии
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Class definitions' в этой спецификации.
Стандарт Изначальное определение
ECMAScript Latest Draft (ECMA-262)
Определение 'Class definitions' в этой спецификации.
Живой стандарт  

Поддержка в браузерах

ВозможностьChromeEdgeFirefoxInternet ExplorerOperaSafari
Базовая поддержка4911345 Нет439
ВозможностьAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Базовая поддержка ? Да1345 Нет ?9

1. From Chrome 42 to 48 strict mode is required. Non-strict mode support can be enabled using the flag "Enable Experimental JavaScript".

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: Bobsans, evilive3000, andrey-gnl, Hydrock, Dmitrii_Aleksandrov, torbasow, terranisu, Witadol
 Обновлялась последний раз: Bobsans,