繁体   English   中英

如何在工厂函数中创建和返回私有对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM