const module = (function() { let _priv = {a:1}; return { get priv() {return _priv} } })(); let obj = module.priv; obj.b = 2; console.log(module.priv); //{a:1, b:2}Usando una función de fábrica (o un patrón de módulo revelador en este caso), ¿cómo 'obtengo' un objeto privado como referencia pero que sea inmutable?
Un ejemplo más práctico es para un juego de tres en raya:
const gameBoard = (function() { let _board = (new Array(9)).fill(''); //want it to be immutable from the outside const add = (index,mark) => { _board[index] = mark; } const getBoard = () => {return _board} return {add, getBoard} })();Quiero que _board solo se cambie con el método add(), pero también quiero una referencia al estado del tablero en otros lugares del código. Pero con este código actual el tablero queda expuesto y puede ser alterado.
¿No sería suficiente devolver una copia superficial?
así que en lugar de
{return _board}Podrías hacerlo
{return [..._board]}así que en tu ejemplo se vería así
const gameBoard = (function() { let _board = (new Array(9)).fill(''); //want it to be immutable from the outside const add = (index,mark) => { _board[index] = mark; } const getBoard = () => {return [..._board]} return {add, getBoard, _board} })(); console.log(gameBoard._board) console.log(gameBoard.getBoard()) console.log(gameBoard._board === gameBoard.getBoard())al ejecutar el código, verá que _board y la matriz devuelta por getBoard() no hacen referencia al mismo objeto... por lo que cambiar la matriz, obtendrá al usar getBoard() no tiene ningún efecto en su tablero real.
Y una vez que eliminó _board de la devolución (lo agregué para poder hacer la comparación fuera de la función), no veo una forma de obtener acceso a _board desde fuera de la función