首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果不使用JavaScript WeakMap键/值对的值,而不使用WeakMap.set方法,有什么不好的地方吗?

如果不使用JavaScript WeakMap键/值对的值,而不使用WeakMap.set方法,有什么不好的地方吗?
EN

Stack Overflow用户
提问于 2017-01-31 19:44:54
回答 1查看 94关注 0票数 1

我刚刚开始学习ES6 WeakMap特性的用例。我读了很多关于这个问题的文章,但是我还没有找到这个问题的答案。

我正在为终端实现一个Node.js扫雷游戏-只是为了好玩和练习。我创建了一个名为MineBoard的类,它将存储游戏操作所需的所有数据和方法。我希望一些成员,如_uncoveredCount (未发现的方块数)和_winningCount (需要赢得的方块数)保持用户无法访问的状态。虽然这个游戏还没有投入生产,但我仍然希望它是不可欺骗的;) -而且,仅使用_前缀来向私有成员发出信号是不够的。

为此,我实现了一个WeakMap,将上述两个示例存储在和其他私有成员中。

方法1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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更容易阅读和遵循代码。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-01-31 19:56:46

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41966218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档