Может ли свойство класса быть одновременно static и private?

Может ли свойство класса быть одновременно static и private?

class CGame
{
    static #varibles = ['truth', 'action'];

    constructor() {}

    #getRandomVarible()
    {
        const num = Math.floor(Math.random() * 100) % 2;

        return CGame.#varibles[num];
    }
}

Ответы (1 шт):

Автор решения: EzioMercer

Согласен с комментаторами, что конкртено в вашем случае (скорее всего) - это не тот случай, когда надо испольовать static и private вместе. Если это чисто внутри класса используется, то стоит убрать static. Но опять таки по коду (как минимум лично мне) трудно так судить, зачем вам этот массив и как static и как private.

Но для примера приведу вариант, когда в целом это может быть полезно:

class GameObject {
  static #nextId = 16;
  #id;
  
  constructor() {
    this.#id = GameObject.#nextId++;
  }
  
  get id() {
    return this.#id;
  }
}

const gameObjects = [];

for(let i = 0; i < 10; ++i) {
  gameObjects[i] = new GameObject();
}

const randomIndex = Math.floor(Math.random() * 10);

console.log(randomIndex, gameObjects[randomIndex].id);

Так у каждого игрового объекта будет свой уникальный id, который можно только получить, но не менять и он будет автомастически создаваться, при каждом создании каждого нового игрового объекта, так что и передавать ничего лишнего не надо будет

Ещё один пример, когда я использую static и private вместе постоянно - это когда создаю что-то типа enum:

class Values {
  static #ONE = 'one';
  static get ONE() {
    return this.#ONE;
  }
  
  static #TWO = 'two';
  static get TWO() {
    return this.#TWO;
  }
  
  // На самом деле тут можно обойтись и без объявления
  // статичного и приватного поля, но мне так привычнее,
  // когда get и set работают именно с полями класса
  
  static get NO_FIELD() {
    return 'no field';
  }
}

console.log(Values.ONE);
console.log(Values.TWO);
console.log(Values.NO_FIELD);

→ Ссылка