From dd2a42c94ba6ae6d2f9f05e860c8de169f7aef41 Mon Sep 17 00:00:00 2001 From: Maxim Postautov <54762420+mpstv@users.noreply.github.com> Date: Mon, 17 May 2021 21:41:55 +0300 Subject: Update "Public class fields" translation (#866) * update public_class_fields translation ru * Update files/ru/web/javascript/reference/classes/public_class_fields/index.html Co-authored-by: Sasha Sushko * review changes * Update files/ru/web/javascript/reference/classes/public_class_fields/index.html * Update files/ru/web/javascript/reference/classes/public_class_fields/index.html Co-authored-by: Sasha Sushko --- .../classes/public_class_fields/index.html | 194 ++++++--------------- 1 file changed, 52 insertions(+), 142 deletions(-) (limited to 'files/ru') diff --git a/files/ru/web/javascript/reference/classes/public_class_fields/index.html b/files/ru/web/javascript/reference/classes/public_class_fields/index.html index b32dc3d2fc..865babfded 100644 --- a/files/ru/web/javascript/reference/classes/public_class_fields/index.html +++ b/files/ru/web/javascript/reference/classes/public_class_fields/index.html @@ -1,25 +1,51 @@ --- -title: Поля классов +title: Публичные поля классов slug: Web/JavaScript/Reference/Classes/Public_class_fields tags: - - JavaScript - Классы + - JavaScript + - Возможности языка translation_of: Web/JavaScript/Reference/Classes/Public_class_fields original_slug: Web/JavaScript/Reference/Classes/Class_fields ---
{{JsSidebar("Classes")}}
-
Объявление публичных и приватных полей является экспериментальной разработкой, предложенной в коммитете стандартов JavaScript TC39. Поддержка браузерами ограничена, но данное нововведение можно использовать посредством транспиляторов (например, Babel). Смотрите информацию о совместимости ниже.
+
+

Примечание: Эта страница описывает экспериментальные возможности.

-

Публичные поля

+

Публичные и приватные поля — это экспериментальная функция (stage + 3), предложенная комитетом по стандарту JavaScript TC39.

+ +

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

+

И статические, и публичные поля являются изменяемыми, перечисляемыми, настраиваемыми свойствами. Таким образом, в отличие от приватных полей, они участвуют в прототипном наследовании.

+

Синтаксис

+ +
class ClassWithInstanceField {
+  instanceField = 'instance field'
+}
+
+class ClassWithStaticField {
+  static staticField = 'static field'
+}
+
+class ClassWithPublicInstanceMethod {
+  publicMethod() {
+    return 'hello world'
+  }
+}
+
+ +

Примеры

+

Публичные статические поля

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

-

Публичные статические поля объявляются при помощи ключевого слова static. Они добавляются в конструктор класса во время его создания с помощью Object.defineProperty. Доступ также осуществляется через конструктор класса.

+

Публичные статические поля объявляются при помощи ключевого слова static. Они добавляются в конструктор класса во время его создания с помощью {{jsxref("Global_Objects/Object/defineProperty", "Object.defineProperty()")}}. Доступ также осуществляется через конструктор класса.

class ClassWithStaticField {
   static staticField = 'static field';
@@ -77,9 +103,10 @@ console.log(SubClassWithStaticField.subStaticField);
 
 

Публичные поля экземпляра

-

Такие публичные поля имеются у каждого экземпляра данного класса. Объявляя публичные поля, мы можем гарантировать, что поле всегда актуально, а объявление класса является более самодокументированным.

+

Такие публичные поля имеются у каждого экземпляра данного класса. Объявляя публичные поля, мы можем гарантировать, что поле всегда присутствует, а объявление класса является более самодокументированным.

-

Публичные поля экземпляра добавляются через Object.defineProperty либо перед тем, как будет исполнено тело конструктора в базовом классе, либо после того, как завершится super() в классе наследнике.

+

Публичные поля экземпляра добавляются через {{jsxref("Global_Objects/Object/defineProperty", + "Object.defineProperty()")}} либо перед тем, как будет исполнено тело конструктора в базовом классе, либо после того, как завершится super() в классе наследнике.

class ClassWithInstanceField {
   instanceField = 'instance field';
@@ -139,13 +166,17 @@ console.log(sub.subInstanceField);
 
 

Ключевое слово static объявляет статический метод класса. Статические методы не вызываются из экземпляра, вместо этого они вызывается из самого класса. Чаще всего это какие-либо служебные функции, такие как функции создания или копирования объектов.

-

{{EmbedInteractiveExample("pages/js/classes-static.html")}}

+
class ClassWithStaticMethod {
+  static staticMethod() {
+    return 'static method has been called.';
+  }
+}
 
-
+console.log(ClassWithStaticMethod.staticMethod());
+// expected output: "static method has been called."
+
-

Статические методы добавляются в конструктор класса с помощью Object.defineProperty во время его создания. Эти методы - изменяемые, неперечисляемые и настраиваемые свойства объекта.

+

Статические методы добавляются в конструктор класса с помощью {{jsxref("Global_Objects/Object/defineProperty", "Object.defineProperty()")}} во время его создания. Эти методы - изменяемые, неперечисляемые и настраиваемые свойства объекта.

Публичные методы экземпляра

@@ -161,7 +192,7 @@ const instance = new ClassWithPublicInstanceMethod(); console.log(instance.publicMethod()); // Ожидаемый вывод: "hello worl​d"
-

Публичные методы добавляются в прототип класса во время его создания с помощью Object.defineProperty. Они изменяемы, неперечисляемы и настраиваемы.

+

Публичные методы добавляются в прототип класса во время его создания с помощью {{jsxref("Global_Objects/Object/defineProperty", "Object.defineProperty()")}}. Они изменяемы, неперечисляемы и настраиваемы.

Вы можете использовать генераторы, асинхронные функции и асинхронные генераторы.

@@ -213,139 +244,18 @@ console.log(instance.msg); // Ожидаемый вывод: "hello cake"
-

Приватные поля

- -

Приватные статические поля

- -

Приватные поля доступны через конструктор внутри объявления самого класса.

- -

Также сохраняется ограничение на вызов статических полей только внутри статических методов.

- -
class ClassWithPrivateStaticField {
-  static #PRIVATE_STATIC_FIELD;
-
-  static publicStaticMethod() {
-    ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD = 42;
-    return ClassWithPrivateStaticField.#PRIVATE_STATIC_FIELD;
-  }
-}
-
-assert(ClassWithPrivateStaticField.publicStaticMethod() === 42);
- -

Приватные статические поля добавляются в конструктор на этапе оценки класса.

- -

Существует ограничение происхождения приватных статических полей. Только класс, который объявляет приватное статическое поле, может обращаться к нему. Это может привести к неожиданному поведению при использовании this.

- -
class BaseClassWithPrivateStaticField {
-  static #PRIVATE_STATIC_FIELD;
-
-  static basePublicStaticMethod() {
-    this.#PRIVATE_STATIC_FIELD = 42;
-    return this.#PRIVATE_STATIC_FIELD;
-  }
-}
-
-class SubClass extends BaseClassWithPrivateStaticField { }
-
-assertThrows(() => SubClass.basePublicStaticMethod(), TypeError);
-
- -

Приватные поля экземпляра объекта

- -

Приватные поля объекта объявляются как # names ( произносятся как "hash names"), которые являются идентификаторами с префиксом #.  # является частью самого имени и также используется для объявления и доступа.

- -

Инкапсуляция обеспечивается языком. Ссылка на # names вне области видимости является синтаксической ошибкой.

- -
class ClassWithPrivateField {
-  #privateField;
-
-  constructor() {
-    this.#privateField = 42;
-    this.#randomField = 666; # Syntax error
-  }
-}
-
-const instance = new ClassWithPrivateField();
-instance.#privateField === 42; // Syntax error
-
- -

Приватные методы

- -

Приватные статические методы

- -

Как и публичные методы, приватные статические методы вызываются в классе, а не в экземплярах класса. Как и приватные статические поля, они доступны только из объявления класса.

- -

Приватные статические методы могут быть генераторами, асинхронными функциями и асинхронными генераторами.

- -
class ClassWithPrivateStaticMethod {
-    static #privateStaticMethod() {
-        return 42;
-    }
-
-    static publicStaticMethod() {
-        return ClassWithPrivateStaticMethod.#privateStaticMethod();
-    }
-}
-
-assert(ClassWithPrivateStaticField.publicStaticMethod() === 42);
-
- -

Приватные методы экземпляра объекта

- -

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

- -
class ClassWithPrivateMethod {
-  #privateMethod() {
-    return 'hello world';
-  }
-
-  getPrivateMessage() {
-      return #privateMethod();
-  }
-}
-
-const instance = new ClassWithPrivateMethod();
-console.log(instance.getPrivateMessage());
-// expected output: "hello worl​d"
- -

Приватные методы экземпляра объекта могут быть генераторами, асинхронными функциями и асинхронными генераторами. Также возможны приватные геттеры и сеттеры:

- -
class ClassWithPrivateAccessor {
-  #message;
-
-  get #decoratedMessage() {
-    return `✨${this.#message}✨`;
-  }
-  set #decoratedMessage(msg) {
-    this.#message = msg;
-  }
-
-  constructor() {
-    this.#decoratedMessage = 'hello world';
-    console.log(this.#decoratedMessage);
-  }
-}
-
-new ClassWithPrivateAccessor();
-// expected output: "✨hello worl​d✨"
-
- -

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

- -

Публичные поля класса

- - - -

{{Compat("javascript.classes.public_class_fields")}}

+

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

-

Приватные поля класса

+{{Specifications}} - +

Браузерная совместимость

-

{{Compat("javascript.classes.private_class_fields")}}

+

{{Compat}}

-

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

+

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

-- cgit v1.2.3-54-g00ecf