![](/img/trans.png)
[英]How to return an Immutable object from a factory function in JavaScript
[英]How to create and return a private object within a factory function?
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() 方法更改,但我还希望在代码中的其他位置引用板的状态。 但是有了这个当前的代码,电路板就会暴露出来并且可以改变。
返回浅拷贝还不够吗?
所以而不是
{return _board}
你可以做
{return [..._board]}
所以在你的例子中看起来像这样
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())
运行代码时,您会看到 _board 和从 getBoard() 返回的数组不引用同一个对象...因此更改数组,您将使用 getBoard() 获得的结果对你的实际_board。
一旦你从返回中删除 _board (我添加它以便能够在函数外部进行比较),我看不到从函数外部访问 _board 的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.