Как по хорошему реализовывается инкапсуляция в ES6? Я прочитал множество источников, но нигде не нашел конкретного ответа(вполне может быть плохо искал). Кто нибудь может дать информацию, например про способ модулей?
Еще из вариантов есть symbol и weakmap, но опять же если захотеть, все можно изменить. Так на сколько ли полноценна реализация инкапсуляции в языке?
Не судите строго, хочется научиться писать чистый код. Буду благодарен, если подкинете пару источников или книг.
На тостере нашел только один вопрос, с хорошим развернутым ответом на эту тематику
Классической инкапсуляции в JS нет и, надеюсь, не будет.
Наиболее приятный в использовании вариант - Symbol, причём он и самый надёжный, так как исходный символ всегда спрятан в модуле и извне поле под таким ключом изменить нереально. С прочтением тоже огромные проблемы, так что тут в полный рост используются сеттеры и геттеры.
Ну из всего прочитанного, я тоже больше всего склоняюсь к symbol. Мне понравилось как парень ответил в этом вопросе Инкапсуляция в Es6 отсуствует?
Посмотрю еще ответы, хотелось бы побольше информации) или примеров реализации
supertoliq:
Ну вот самая банальная реализация, пуленепробиваемая при том. Идея с WeakMap мне не сильно по душе, так как это не инкапсуляция по сути, а внешнее хранилище.
const isDisabled = Symbol();
class Item {
constructor () {
this[isDisabled] = false;
}
get isDisabled () {
return this[isDisabled];
}
set isDisabled(value) {
this[isDisabled] = value;
}
}
supertoliq: истинная инкапсуляция, по сути, препятствует динамическому прототипному наследованию, которое, как всем известно, является одной из основных фич языка.
MaxKorz: а я и не говорю, что с символом нельзя доступ получить, я о том, что Typescript не панацея. Да, он сильно выручит при самой разработке, но от хитрых жоп и кривых рук не убережёт.
MaxKorz: к сожалению, не на всех проектах можно использовать TypeScript, а вот чистый ES6+ - можно. Сам на таком работаю.
Пуленепробиваемой оно, кстати, станет после правильного бандла. Ведь "приватные" поля хранятся в самом обьекте, а не в центральном подвале, который ещё и зануллить можно, кстати, случайно.
Но, опять же, я не претендую на 100% истинность своих суждений. Твой пример тому пример )
Negwereth инкапсуляция вообще не может быть или не быть в каком-то языке, инкапсуляция это подход, реализуемый на абсолютно любом языке. Все эти приватные свойства и методы используются чтобы инкапсуляция была более целостной, надёжной, но это не значит что без них инкапсуляции нет.
Ещё Вы почему-то не упомянули замыкания, через которые вполне можно скрывать данные.
Алсо, видимо приватные поля таки в обозримом будущем в JS появятся.