Estoy escribiendo una clase donde tengo algunos datos (podría ser hasta 100K) en forma de matriz. Los datos deben agregarse de manera 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.log(addProximityValues.setValues(...[10, 20, 40])); console.log(addProximityValues.getValues().push(50)); // don't want push to work console.log(addProximityValues.getValues()); console.log('*********************************'); console.log(addProximityValues.getValueEff().push(50)); // don't want push to work console.log(addProximityValues.getValues());Desde el código cuando devuelvo la matriz, devuelve la referencia y puede escribirle valores sin llamar a la función de clase. Quiero que solo el método de clase pueda actualizar los valores.
Una forma de hacer esto es devolver una nueva matriz a partir de los valores existentes, pero se necesitará más memoria si la matriz es demasiado grande. ¿Hay alguna manera de lograrlo de una manera más eficiente?
Una opción es que getValues no devuelva una matriz. Podría devolver un iterador de matriz (o incluso podría hacer que su clase sea iterable agregando una función [Symbol.iterator] ). Un iterador proporciona acceso secuencial a los valores de la matriz sin permitir la modificación de la matriz. También podría proporcionar un método para obtener un valor para un índice dado, y tal vez incluso una propiedad de 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.log(addProximityValues.getValues().push(50)); // don't want push to work // The code using it can loop through for (const value of addProximityValues) { console.log(value); } console.log(`Value at index 2: ${addProximityValues.get(2)}`); console.log(`There are ${addProximityValues.length} values`); // The code can still get all the values as an array if it really needs to console.log([...addProximityValues]);