2017-01-31 8 views
1

Я только начинаю изучать прецеденты для функции ES6 WeakMap. Я много читал об этом, но я не смог найти ответ на этот конкретный вопрос.Есть ли недостатки в изменении значения пары JavaScript/WeakMap JavaScript без использования метода WeakMap.set?

Я реализую игру Node.js Minesweeper для терминала - просто для удовольствия и практики. Я создал класс под названием 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 - для чтения и выполнения кода.

Спасибо!

ответ

0

Вы можете (и должны) использовать первый метод. Нет никакого недостатка в использовании первого метода, и он, вероятно, более эффективен в любом случае, поскольку вы создаете только один объект на один экземпляр MineBoard. Это также означает, что добавление/удаление частных свойств намного проще. Кроме того, изнутри вашего экземпляра MineBoard вы сможете легко перебирать все частные свойства, используя Object.keys(_mineBoardPrivateData.get(this)) (попробуйте сделать это со вторым методом).

+0

Ваше рассуждение имеет смысл для меня - спасибо за отзыв! –