Я пишу класс, в котором у меня есть некоторые данные (это может быть до 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());
Из кода, когда я возвращаю массив, он возвращает ссылку, и вы можете записывать в него значения, не вызывая функцию класса. Я хочу, чтобы только метод класса мог обновлять значения.
Один из способов сделать это — вернуть новый массив из существующих значений, но если массив слишком велик, потребуется больше памяти. Есть ли способ достичь этого более эффективным способом?
Всякий раз, когда пользователь пытается завершить маршрут, нам нужно проверить все значения для последующей отладки сеанса. Мы просто не хотим, чтобы какой-либо фрагмент кода за пределами этого класса мог обновлять частные данные для этого класса.
this.#values.
хэштег имеет недопустимый синтаксис? Я не знаю. Языковые ярлыки?
Это новый способ определения закрытых переменных в классе Javascript. проверьте здесь для получения дополнительной информации.
@GetSet — это частное поле. Они будут в спецификации ES2022, но поддерживаются всеми современными средами.
Технические характеристики быстро меняются @T.J.Crowder. Или я полагаюсь на «обычный» js. Мне нужно исследовать, где я могу использовать этот новый материал.
Один из вариантов — вообще не возвращать 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]);
Каковы варианты использования вызова кода
getValues
?