eruditecat
@eruditecat
Красноглазик

Инкапсуляция в Es6 отсуствует?

Раньше я объявлял приватные свойства и методы так:

function MyClass () {
  var privateProperty = 'value';
  var privateMethod = function () {
    console.log ('Hi, I am privateMethod');
  };

  this.publicMethod = function () {
    privateMethod ();
    return privateProperty;
  };
}


А теперь я такой обрадовался и начал на Es6 писать:

class MyClass {
  constructor () {
    // F**k yeah, я использую Es6... Как нет приватных свойств? o.O

    var privateProperty = 'value';
    var privateMethod = function () {
      console.log ('Hi, I am privateMethod');
    };

    // Нет-нет, постойте, какого ...?
  }
}


Собственно, классы, это упрощённый синтаксис, поддержка которого не имеет значения, если я хочу использовать инкапсуляцию? Или я что-то упустил?
  • Вопрос задан
  • 2661 просмотр
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Раньше я объявлял приватные свойства и методы так:


Раньше вы криво создавали объекты и у вас получалась кривая реализация паттерна "модуль". Да и "свойства и методы" ваши приватные они как бы не совсем свойства и методы, это просто переменные (статические свойства в терминах java) и функции.

Или я что-то упустил?

Инкапсуляция в javascript достигается и достигалась ранее за счет модулей (сокрытие переменных в дочернем скоупе.

let privateStaticVar = 'foo';

// то что экспортируется - то публичное
export default class MyClass() {
    constructor() {
    }
}

// или

export default (function () {
    let foo = 'foo';

    return class FooBar {
         constructor() {
         }
    };
}());


Ну и в es2015 добавились символы как простой вариант сделать настоящие приватные переменные, ну и еще есть weakmap.

const privateFoo = Symbol('foo');

export default FooBar {
    constructor(foo) {
       this[privateFoo] = foo;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы