Я не понимаю, в чем смысл геттеров и сеттеров в классах ECMAScript 6. Какая цель? Ниже приведен пример, о котором я говорю:
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
return this._name.toUpperCase();
}
set name(newName){
if(newName){
this._name = newName;
}
}
}
class
ecmascript-6
setter
getter
TruMan1
источник
источник
Ответы:
Эти сеттеры и геттеры позволяют напрямую использовать свойства (без использования скобок)
Это только для установки и получения значения свойства.
источник
set name(newName) { this._name = newName; }
Get:get name() { return this._name.toUpperCase(); }
Геттеры и сеттеры в ES6 служат той же цели, что и в других языках ... включая ES5. ES5 уже позволяет использовать геттеры и сеттеры
Object.defineProperty
, хотя они менее чисты и более громоздки в использовании.Фактически, геттеры и сеттеры позволяют использовать стандартную нотацию доступа к свойствам для чтения и записи, сохраняя при этом возможность настраивать способ получения и изменения свойства без необходимости явных методов получения и установки.
В приведенном выше классе Employee это будет означать, что вы можете получить доступ к
name
свойству следующим образом:Это выглядело бы как обычный доступ к свойству, но на самом деле он будет вызывать
toUpperCase
имя перед его возвратом. Аналогично поступаем так:будет обращаться к установщику и не будет изменять внутреннее
_name
свойство из-за предложения защиты, введенного вname
установщике.См. Также общий вопрос, зачем использовать геттеры и сеттеры? для получения дополнительной информации о том, почему возможность изменять функциональные возможности доступа к членам полезна.
источник
У геттеров и сеттеров ES6 совершенно другая мотивация, чем у аналогичных концепций в Java.
В Java геттеры и сеттеры позволяют классу определять JavaBean. Смысл геттеров и сеттеров заключается в том, что они позволяют компоненту иметь полностью ортогональный «интерфейс» по сравнению с тем, что подразумевается общедоступными полями. Таким образом, у меня может быть поле «имя», которое НЕ является свойством JavaBean, и у меня может быть «адрес» свойства JavaBean, которое НЕ является полем.
Свойства JavaBean также «обнаруживаются» тысячами фреймворков (например, Hibernate) через отражение Java. Таким образом, геттеры и сеттеры являются частью стандартного метода «раскрытия» свойств компонента.
Геттеры и сеттеры, будучи функциями, также имеют то значение, что они «абстрагируют» реализацию. Это может быть ЛИБО поле или вычисленное («синтетическое») значение. Итак, если у меня есть свойство bean-компонента под названием «zipcode», оно начинается как сохраненная строка. Теперь предположим, что я хочу изменить его на значение, вычисленное из адреса / города / штата?
Если я использую поле, этот код ломается:
Но если я использую геттер, это не сломается:
В JavaScript нет ничего похожего на JavaBeans. Насколько я читал, предполагаемое значение GET и SET ограничено вышеупомянутыми «синтетическими» (вычисленными) свойствами.
Но это несколько лучше, чем java в том, что, хотя Java не позволяет вам совместимо преобразовывать «поле» в метод, ES6 GET и SET позволяют это.
То есть, если у меня есть:
Если я изменю zipcode из стандартного свойства объекта на геттер, то приведенный выше код теперь вызывает функцию GET.
Обратите внимание: если бы я не включил GET в определение, это НЕ будет вызывать метод GET почтового индекса. Вместо этого он просто назначит функцию zipcode переменной.
Итак, я думаю, что это некоторые важные различия для понимания между методами получения и установки Java и JavaScript ES6.
источник
В любом случае,
getter
иsetter
это как шпион. Он отслеживает свойство объекта, так что вы можете что-то делать каждый раз, когда получаете или устанавливаете значение свойства.источник