Quería hacer un objeto en el que no pudieras mutar directamente las variables, así que decidí crear lo que es esencialmente una tienda con un reductor similar a redux. Cuando devuelvo la tienda con la función get() , devuelvo una copia de la tienda en lugar de la tienda original, por lo que no se puede mutar directamente. Hay variables en la tienda que quiero que permanezcan intactas en todo el controlador.
Mi pregunta es si hay alguna compensación seria en el rendimiento que deba tener en cuenta al hacer una copia del objeto frente a devolver el objeto completo. La función get() se utilizará mucho, por lo que se realizarán muchas copias. También lo uso en una función requestAnimationFrame donde la función get() se llamará muchas veces para cada animationFrame . Supongo que la copia anterior se eliminará de la memoria cuando ya no esté en uso, pero no estoy seguro.
Aquí hay un ejemplo muy simple.
const reducer = (store, action) => { switch(action.type) { case 'SET_FOO': return { ...store, foo: action.payload } case 'SET_BAR': return { ...store, bar: action.payload } default: return store } } const createController = () => { let store = { foo: 'foo', bar: 'bar' } const get = () => ({...store}) const dispatch = (action) => (store = reducer(store, action)) // A bunch of other irrelevant functions here return { get, dispatch } } Como puede ver en la función get() , estoy enviando una copia de la tienda en lugar de la tienda real. De esta manera, es imposible que la persona que crea el controlador mute la tienda directamente. Si acabo de devolver la tienda, podría hacer algo como lo siguiente y mutar directamente la tienda que estoy tratando de evitar.
const ctl = createController() const store = ctl.get() store.foo = 'baz' console.log(store.get().foo) // result would be 'baz'Pero si devuelve una copia de la tienda, entonces no podrían mutar directamente la tienda, sino que tendría que enviar al reductor para mutarla. Pero, ¿hay algún problema serio de rendimiento que deba tener en cuenta aquí? Sé que agregar más objetos puede usar más memoria, pero no creo que haga una gran diferencia.
Cualquier idea sería apreciada. Gracias