1

我刚刚开始学习 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 更易于阅读和遵循代码。

谢谢!

4

1 回答 1

0

您可以(并且应该)使用第一种方法。使用第一种方法没有任何缺点,而且它可能更有效,因为您只为每个MineBoard实例创建一个对象。这也意味着添加/删除私有属性要容易得多。此外,从您的MineBoard实例内部,您将能够轻松地迭代所有仅使用的私有属性Object.keys(_mineBoardPrivateData.get(this))(尝试使用第二种方法)。

于 2017-01-31T19:56:46.530 回答