Прямой аналог, который не является идиоматическим для классов ES6:
class MyClass {}
MyClass.prototype.value = (() => {
let privateVariable = 0;
return function() {
return ++privateVariable;
};
})();
Нет практических причин делать privateVariable
полностью недоступным из внешней области видимости, тем более что он не очень хорошо работает с классами ES6. Это не может считаться правильной инкапсуляцией, потому что privateVariable
недоступен для отражения; он также не может выступать в качестве защищенного члена.
Может быть закрытый член, который хранит значение:
class MyClass {
constructor() {
this._value = 0;
}
value() {
return ++this._value;
}
}
Это может быть символ, но это не делает дизайн класса более безопасным, просто добавляет дополнительные сложности, когда класс наследуется в другом модуле:
// should be carried around everywhere to make the class extendable
export const VALUE = Symbol('value');
class MyClass {
constructor() {
this[VALUE] = 0;
}
value() {
return ++this[VALUE];
}
}
Обратите внимание, что get value() {}
не то же самое, что value() {}
.
Одним из преимуществ TypeScript (который является расширенным набором ECMAScript) является инкапсуляция, которая применяется во время компиляции.