Обновляйте массив только с помощью методов класса, когда массив является частной собственностью в классе

Я пишу класс, в котором у меня есть некоторые данные (это может быть до 100 КБ) в виде массива. Данные должны быть добавлены в порядке LIFO.

class AddProximityValues {
    #values = [];
    
    getValues () {
        return this.#values;
    } 
    
    setValues(...elements) {
        this.#values.push(...elements);
    }
    
    //tried this way not sure
    // if this is the right way of doing this
    getValueEff() {
      return [...this.#values]
    }
}

const addProximityValues = new AddProximityValues();


console.info(addProximityValues.setValues(...[10, 20, 40]));
console.info(addProximityValues.getValues().push(50)); // don't want push to work
console.info(addProximityValues.getValues());


console.info('*********************************');
console.info(addProximityValues.getValueEff().push(50)); // don't want push to work
console.info(addProximityValues.getValues());

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

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

Каковы варианты использования вызова кода getValues?

T.J. Crowder 19.03.2022 09:23

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

Apoorva Chikara 19.03.2022 09:29
this.#values. хэштег имеет недопустимый синтаксис? Я не знаю. Языковые ярлыки?
GetSet 19.03.2022 09:37

Это новый способ определения закрытых переменных в классе Javascript. проверьте здесь для получения дополнительной информации.

Apoorva Chikara 19.03.2022 09:39

@GetSet — это частное поле. Они будут в спецификации ES2022, но поддерживаются всеми современными средами.

T.J. Crowder 19.03.2022 09:49

Технические характеристики быстро меняются @T.J.Crowder. Или я полагаюсь на «обычный» js. Мне нужно исследовать, где я могу использовать этот новый материал.

GetSet 19.03.2022 09:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из вариантов — вообще не возвращать getValues массив. Он может возвращать массив итератор (или вы даже можете сделать свой класс итерируемым, добавив функцию [Symbol.iterator]). Итератор обеспечивает последовательный доступ к значениям массива, не допуская модификации массива. Вы также можете предоставить метод для получения значения для заданного индекса и, возможно, даже свойства length:

class AddProximityValues {
    #values = [];
    
    [Symbol.iterator]() {
        // Return an iterator for the values
        return this.#values[Symbol.iterator]();
    } 

    get(index) {
        return this.#values[index];
    }
    
    get length() {
        return this.#values.length;
    }
    
    setValues(...elements) {
        this.#values.push(...elements);
    }
}

const addProximityValues = new AddProximityValues();

addProximityValues.setValues(...[10, 20, 40]);
// This would fail, no `push` on an iterator
// console.info(addProximityValues.getValues().push(50)); // don't want push to work
// The code using it can loop through
for (const value of addProximityValues) {
    console.info(value);
}
console.info(`Value at index 2: ${addProximityValues.get(2)}`);
console.info(`There are ${addProximityValues.length} values`);
// The code can still get all the values as an array if it really needs to
console.info([...addProximityValues]);

Другие вопросы по теме