Ответ 1
Вы не можете различать прямой доступ к свойствам и доступ к методу.
Это главный аргумент в их пользу.
Одна из самых страшных попыток написания классического кода OO для Java-стиля заключается в том, что любой объект с открытым свойством на нем должен иметь письменные записи и сеттеры, и из этого выйдет огромное количество шаблонов, особенно для больших объекты типа структуры данных (например, DTOs).
Обоснование всего этого состоит в том, что вы не можете просто сделать свойства общедоступными, потому что в противном случае вы никогда не сможете добавлять к ним логику, не нарушая API (например, логику, чтобы разрешать только определенные значения или рефакторировать и хранить свойство несколько по-другому, при этом все же выставляя один и тот же внешний API или аналогичный). См. https://softwareengineering.stackexchange.com/questions/176876/why-shouldnt-i-be-using-public-variables-in-my-java-class для некоторых типичных аргументов вокруг этого.
Я думаю, вы могли бы с уверенностью сказать, что в последние годы это было доведено до логического предела, но это не значит, что это неправильно; выставляя публичное поле для прямого доступа, вы действительно подвергаете внутреннюю реализацию того, как вы храните эти данные, а это означает, что вы не можете изменить его как легко или безопасно.
Получатели/сеттеры ES6 исправляют это. Тот факт, что что-то читается как прямое свойство объекта, больше ничего не говорит о реализации этого свойства. Это могло быть полем первоначально, но в последнее время оно превратилось в аксессуар свойств ES6 вместо этого, без изменения API. Реализация свойства скрыта от остальной части вашей кодовой базы и поэтому легче изменить.
Недостаток заключается в том, что не интуитивно понятно, что для свойства, к которому вы обращаетесь, может потребоваться большая вычислительная мощность (и, следовательно, его следует помнить) или что он изменяется каждый раз, когда вы обращаетесь к нему.
Вы правы, это риск. Это также gotcha с любым getX(); существует сильное соглашение о том, что хорошие простые методы, такие как "getName()", никогда не должны делать дорогостоящие вещи за кулисами, даже если они являются методами, и если вы нарушите это, вы почти наверняка поймаете людей (в том числе себя, через 6 месяцев)
Перемещение к свойствам не изменяет этого, но вы правы, что ES6 означает, что вам больше не гарантируется безопасность для простых доступов к свойствам. Ответ на самом деле заключается в том, что вы должны убедиться, что вы (и все остальные) придерживаетесь соглашения и Принцип наименьшего удивления: как с существующим простым ищущие геттеры и сеттеры, аксессоры доступа ES6 должны делать простые дешевые вещи и не должны иметь странных побочных эффектов в других местах.