Учитывая вашу текущую реализацию:
- Ваша
let x
не очень полезна, потому что на нее можно ссылаться только в конструкторе.Его нельзя использовать ни в одном из методов-прототипов.С другой стороны, на WeakMap можно ссылаться где угодно.Это довольно большая разница. - На вашу WeakMap можно ссылаться где угодно.Это означает, что он на самом деле не обеспечивает никакой конфиденциальности;все, что имеет ссылку на экземпляр и WeakMap, может получить доступ к значению
radius
, которое вы хотели бы использовать в частном порядке.
Если вы хотите, чтобы WeakMap был должным образом закрытым, череззамыкания, вы можете использовать IIFE для определения класса, например:
const myClass = (() => {
const weakMap = new WeakMap();
return class Circle {
// etc
})();
Таким образом, верхний уровень имеет ссылку только на myClass
, а не на weakMap
.
Я бы использовал ваш let x
в конструкторе всякий раз, когда переменная всего необходима в конструкторе - не обязательно для ради сокрытия данных, но только потому, что она не имеетиспользовать за пределами конструктора.См. Почему это хорошая практика программирования для ограничения области действия?
Обратите внимание, что в настоящее время существует предложение для полей класса , которое, вероятно, в конечном итоге будет реализовано, включая синтаксис дляличные поля, например:
class Circle {
constructor(radius) {
this.#x = radius;
// ...
Это позволит получить доступ к #x
из любой точки Circle
, но нигде больше.Это функционально эквивалентно реализации WeakMap
.