Может ли свойство класса быть одновременно 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 шт):
Согласен с комментаторами, что конкртено в вашем случае (скорее всего) - это не тот случай, когда надо испольовать 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);