【发布时间】:2022-07-22 02:13:36
【问题描述】:
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}
使用工厂函数(或在这种情况下显示模块模式),我如何“获取”一个私有对象以供参考但使其不可变?
一个更实际的例子是井字游戏:
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 仅由 add() 方法更改,但我还希望在代码中的其他位置引用板的状态。但是使用这个当前代码,电路板是公开的并且可以更改。
【问题讨论】:
-
使用
Object.freeze冻结板子? -
要么首先
Object.freeze(),要么在每次调用getBoard时分发一份副本。 -
@Bergi 什么是只返回副本的好方法?
-
返回
{..._priv}或_board.slice()什么的
标签: javascript object module closures