我刚刚开始学习ES6 WeakMap特性的用例。我读了很多关于这个问题的文章,但是我还没有找到这个问题的答案。
我正在为终端实现一个Node.js扫雷游戏-只是为了好玩和练习。我创建了一个名为MineBoard的类,它将存储游戏操作所需的所有数据和方法。我希望一些成员,如_uncoveredCount (未发现的方块数)和_winningCount (需要赢得的方块数)保持用户无法访问的状态。虽然这个游戏还没有投入生产,但我仍然希望它是不可欺骗的;) -而且,仅使用_前缀来向私有成员发出信号是不够的。
为此,我实现了一个WeakMap,将上述两个示例存储在和其他私有成员中。
方法1:
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实现示例都遵循下面的样式。
方法2:
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更容易阅读和遵循代码。
谢谢!
发布于 2017-01-31 19:56:46
您可以(而且应该)使用第一种方法。使用第一种方法没有什么缺点,而且它可能更有效,因为您只在每个MineBoard实例中创建一个对象。这也意味着添加/删除私有属性要容易得多。此外,在您的MineBoard实例中,您可以使用Object.keys(_mineBoardPrivateData.get(this))轻松地遍历所有私有属性(尝试使用第二种方法)。
https://stackoverflow.com/questions/41966218
复制相似问题