Spec-Zone.ru › JavaScript

static

Baseline Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с марта 2016 года.

Ключевое слово static определяет статический метод или поле для класса, или блок статической инициализации (см. ссылку для получения дополнительной информации об этом использовании). Статические свойства не могут быть доступны напрямую из экземпляров класса. Вместо этого они доступны через сам класс.

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

Примечание: В контексте классов контент MDN Web Docs использует термины "свойства" и "поля" взаимозаменяемо.

Попробуйте

class ClassWithStaticMethod {
  static staticProperty = "someValue";
  static staticMethod() {
    return "static method has been called.";
  }
  static {
    console.log("Class static initialization block called");
  }
}

console.log(ClassWithStaticMethod.staticProperty);
// Expected output: "someValue"
console.log(ClassWithStaticMethod.staticMethod());
// Expected output: "static method has been called."

Синтаксис

class ClassWithStatic {
  static staticField;
  static staticFieldWithInitializer = value;
  static staticMethod() {
    // …
  }
}

Существуют некоторые дополнительные ограничения синтаксиса:

  • Имя статического свойства (поля или метода) не может быть prototype.
  • Имя поля класса (статического или экземплярного) не может быть constructor.

Описание

На этой странице представлены общедоступные статические свойства классов, которые включают статические методы, статические аксессоры и статические поля.

  • Для частных статических элементов см. частные элементы.
  • Для элементов экземпляров см. определения методов, геттеры, сеттеры и общедоступные поля классов.

Общедоступные статические элементы объявляются с использованием ключевого слова static. Они добавляются к конструктору класса во время оценки класса с использованием семантики [[DefineOwnProperty]] (которая по сути является Object.defineProperty()). Они снова доступны из конструктора класса.

Статические методы часто являются утилитарными функциями, такими как функции для создания или клонирования экземпляров. Общедоступные статические поля полезны, когда вам нужно, чтобы поле существовало только один раз на класс, а не на каждом создаваемом экземпляре класса. Это полезно для кэшей, фиксированной конфигурации или любых других данных, которые вам не нужно реплицировать между экземплярами.

Имена статических полей могут быть вычисляемыми. Значение this в вычисляемом выражении — это this, окружающий определение класса, а ссылка на имя класса является ReferenceError, поскольку класс еще не инициализирован. await и yield работают как ожидается в этом выражении.

Статические поля могут иметь инициализатор. Статические поля без инициализаторов инициализируются значением undefined. Общедоступные статические поля не переинициализируются в подклассах, но доступны через цепочку прототипов.

class ClassWithStaticField {
  static staticField;
  static staticFieldWithInitializer = "static field";
}

class SubclassWithStaticField extends ClassWithStaticField {
  static subStaticField = "subclass field";
}

console.log(Object.hasOwn(ClassWithStaticField, "staticField")); // true
console.log(ClassWithStaticField.staticField); // undefined
console.log(ClassWithStaticField.staticFieldWithInitializer); // "static field"
console.log(SubclassWithStaticField.staticFieldWithInitializer); // "static field"
console.log(SubclassWithStaticField.subStaticField); // "subclass field"

В инициализаторе поля this ссылается на текущий класс (к которому также можно получить доступ через его имя), а super ссылается на конструктор базового класса.

class ClassWithStaticField {
  static baseStaticField = "base static field";
  static anotherBaseStaticField = this.baseStaticField;

  static baseStaticMethod() {
    return "base static method output";
  }
}

class SubClassWithStaticField extends ClassWithStaticField {
  static subStaticField = super.baseStaticMethod();
}

console.log(ClassWithStaticField.anotherBaseStaticField); // "base static field"
console.log(SubClassWithStaticField.subStaticField); // "base static method output"

Выражение вычисляется синхронно. Вы не можете использовать await или yield в выражении инициализатора. (Представьте, что выражение инициализатора неявно обернуто в функцию.)

Инициализаторы статических полей и блоки статической инициализации вычисляются по порядку. Инициализаторы полей могут ссылаться на значения полей выше них, но не ниже. Все статические методы добавляются заранее и доступны, хотя их вызов может вести себя непредсказуемо, если они ссылаются на поля ниже инициализируемого.

Примечание: Это особенно важно для частных статических полей, поскольку доступ к неинициализированному частному полю вызывает TypeError, даже если частное поле объявлено ниже. (Если частное поле не объявлено, это будет ранняя SyntaxError.)

Примеры

Использование статических членов в классах

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

  1. Как статический член (метод или свойство) определяется в классе.
  2. Что класс со статическим членом может быть подклассирован.
  3. Как статический член может и не может быть вызван.
class Triple {
  static customName = "Tripler";
  static description = "I triple any number you provide";
  static calculate(n = 1) {
    return n * 3;
  }
}

class SquaredTriple extends Triple {
  static longDescription;
  static description = "I square the triple of any number you provide";
  static calculate(n) {
    return super.calculate(n) * super.calculate(n);
  }
}

console.log(Triple.description); // 'I triple any number you provide'
console.log(Triple.calculate()); // 3
console.log(Triple.calculate(6)); // 18

const tp = new Triple();

console.log(SquaredTriple.calculate(3)); // 81 (not affected by parent's instantiation)
console.log(SquaredTriple.description); // 'I square the triple of any number you provide'
console.log(SquaredTriple.longDescription); // undefined
console.log(SquaredTriple.customName); // 'Tripler'

// This throws because calculate() is a static member, not an instance member.
console.log(tp.calculate()); // 'tp.calculate is not a function'

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

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

class StaticMethodCall {
  static staticProperty = "static property";
  static staticMethod() {
    return `Static method and ${this.staticProperty} has been called`;
  }
  static anotherStaticMethod() {
    return `${this.staticMethod()} from another static method`;
  }
}
StaticMethodCall.staticMethod();
// 'Static method and static property has been called'

StaticMethodCall.anotherStaticMethod();
// 'Static method and static property has been called from another static method'

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

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

class StaticMethodCall {
  constructor() {
    console.log(StaticMethodCall.staticProperty); // 'static property'
    console.log(this.constructor.staticProperty); // 'static property'
    console.log(StaticMethodCall.staticMethod()); // 'static method has been called.'
    console.log(this.constructor.staticMethod()); // 'static method has been called.'
  }

  static staticProperty = "static property";
  static staticMethod() {
    return "static method has been called.";
  }
}

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

Specification
ECMAScript® 2027 Language Specification
# sec-class-definitions

Совместимость с браузерами

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
static
49
42–49Требуется строгий режим.
13
45
36
29–36Требуется строгий режим.
9
9
49
42–49Требуется строгий режим.
45
36
29–36Требуется строгий режим.
9
5.0
4.0–5.0Требуется строгий режим.
49
42–49Требуется строгий режим.
9
1.0.0
1.0
6.0.0
class_fields
72
79
75
60
14.1
72
79
51
14.5
11.0
72
14.5
1.0.0
1.0
12.0.0
initialization_blocks
94
94
93
80
16.4
94
93
66
16.4
17.0
94
16.4
1.0.0
1.14
16.11.0

См. также

  • Руководство по использованию классов
  • Классы
  • Блоки статической инициализации
  • class

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API