MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

Это экспериментальная технология, часть предложения Harmony (ECMAScript 6).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.

Для того, чтобы объявить статический метод класса, необходимо использовать слово 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 Tripple {
  static tripple(n) {
    n = n || 1;
    return n * 3;
  }
}

class BiggerTripple extends Tripple {
  static tripple(n) {
    return super.tripple(n) * super.tripple(n);
  }
}

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

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

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

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

Браузер Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 42.0 45.0 ? ? ?
Браузер Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка ? 42.0 Доступно только в ночных сборках (с февраля 2015) ? ? ?

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

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

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