我刚刚开始学习 ES6 WeakMap 功能的用例。我已经阅读了很多关于它的内容,但我无法找到这个特定问题的答案。
我正在为终端实现一个 Node.js Minesweeper 游戏——只是为了好玩和练习。我创建了一个名为 MineBoard 的类,它将存储游戏运行所需的所有数据和方法。我希望某些成员,例如 _uncoveredCount(未覆盖的方块数)和 _winningCount(获胜所需的未覆盖的方块数)对用户保持无法访问。虽然这个游戏没有投入生产,但我仍然希望它是不可吃的;) - _ 前缀的命名约定来表示私人成员是不够的。
为此 - 我实现了一个 WeakMap 来存储上述两个示例和其他私有成员。
方法一:
let _mineBoardPrivateData = new WeakMap();
class MineBoard {
constructor(size, difficulty) {
this.size = size || 10;
this.difficulty = difficulty || 1;
_mineBoardPrivateData.set(this, {});
_mineBoardPrivateData.get(this).winningCount = someMethodForDeterminingCount();
_mineBoardPrivateData.get(this).isGameOver = false;
_mineBoardPrivateData.get(this).uncoveredCount = 0;
//more code
}
generateNewBoard() {
//code
}
uncoverSquare() {
//more code
_mineBoardPrivateData.get(this).uncoveredCount++;
}
//more code
}
在上面这样做对我来说更容易 - 而且眼睛也更容易。然而,我见过的大多数 WeakMap 实现的例子都遵循下面的风格。
方法二:
let _winningCount = new WeakMap();
let _isGameOver = new WeakMap();
let _uncoveredCount = new WeakMap();
//more instantiations of WeakMap here
class MineBoard {
constructor(size, difficulty) {
this.size = size || 10;
this.difficulty = difficulty || 1;
_winningCount.set(this, someMethodForDeterminingWinningCount() );
_isGameOver.set(this, false);
_uncoveredCount.set(this, 0);
//more private data assignment here
}
generateNewBoard() {
//code
}
uncoverSquare() {
//more code
_uncoveredCount.set(this, _uncoveredCount.get(this) + 1);
}
//more code
}
所以我的问题是 - 使用我没有看到的方法 1 有什么缺点吗?这使得更简单的解决方案和 IMO 更易于阅读和遵循代码。
谢谢!