ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку
logo

Как создать переменные класса в ES6: альтернативные способы

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Статические свойства классов в ES6 позволяют определить константные значения, которые общие для всех экземпляров данного класса. Объявляются они с помощью ключевого слова static.

JS
Скопировать код
class Example {
  static sharedValue = 'Значение, одинаковое для всех экземпляров';
}

console.log(Example.sharedValue); // Выведет: Значение, одинаковое для всех экземпляров

Если сравнить с другими языками программирования, в ES6 нет встроенного механизма для создания переменных класса. Тем не менее, ключевое слово static предоставляет эффективное решение этой задачи. Публичные поля классов, находящиеся в разработке и находящиеся на третьей стадии предложения, позволяют задавать значения переменных непосредственно в теле класса с помощью синтаксиса varName = value.

Объявление переменных экземпляра

Переменные экземпляра объявляются прямо в теле класса. Для удобной организации кода в этой сфере работают поля класса или геттеры/сеттеры:

JS
Скопировать код
class CleanCode {
  field = 'это значение';              // Это публичное поле класса
  #privateField = 'это приватное';    // Это приватное поле класса (находится на стадии предложения)
                                   
  get computedValue() {                // Геттеры как бы открывают занавес, позволяя легко получить данные
    return `Что-то рассчитанное на основе ${this.field}`;
  }

  set field(value) {                   // Сеттеры управляют изменением внутренних данных
    this.#privateField = value;
  }
}

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

Управление конфиденциальной информацией

Для контроля доступа к приватным данным класса используются статические геттеры и сеттеры в паре с приватными полями. Это предотвращает несанкционированный доступ и модификацию данных:

JS
Скопировать код
class SecureBox {
  static #internalKey = 'Тайна';  // Это своего рода тайник
  
  static get key() {               // Предоставляет защиту при доступе к тайнике
    return SecureBox.#internalKey;
  }
  
  static set key(value) {       // Защищает процесс присваивания нового значения
    SecureBox.#internalKey = value;
  }
}

Такой подход инкапсуляции особенно полезен в наследуемых классах для предотвращения перекрытия имен переменных.

Использование WeakMap для приватных переменных

Для управления приватными переменными удобно использовать WeakMap. Это структура данных автоматически собирает мусор и выполняет «уборку»:

JS
Скопировать код
const privateMembers = new WeakMap();

class EcoFriendly {
  constructor(data) {
    privateMembers.set(this, data); // Данные тут в безопасности
  }
  
  doSomething() {                
    const data = privateMembers.get(this); // Получить доступ к данным настолько просто, сколько безопасно 
    console.log(data);
  }
}

let eco = new EcoFriendly('Защищено');
eco.doSomething(); // Код в безопасности, и вы управляете ситуацией!

Влияние на производительность: выбор важен!

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

Гибкость с динамическим созданием переменных класса

Для любителей динамического расширения возможностей есть вариант манипулировать свойствами prototype. Это добавляет переменные экземпляра динамически, не используя конструктор:

JS
Скопировать код
class Dynamic {
  static addMethod(name, method) {
    this.prototype[name] = method;   // Дополнительные методы для индивидуализации!
  }
}

Dynamic.addMethod("sayHey", function(){
  console.log("Привет!");            // Стиль, достойный звезды
});