Что такое геттеры и сеттеры для классов ECMAScript 6?
Я смущен тем, что точка геттеров и сеттеров находится в классах 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;
}
}
}
3 ответа:
эти сеттер и геттер позволяют использовать свойства напрямую (без использования скобок)
var emp = new Employee("TruMan1"); if (emp.name) { // uses the get method in the background } emp.name = "New name"; // uses the setter in the background
Это только для установки и получения значения свойства.
геттеры и сеттеры в ES6 служат той же цели, что и на других языках... в том числе в ES5. В ES5, уже позволяет геттеры и сеттеры через
Object.defineProperty
, хотя они менее чистые и более громоздкие в использовании.фактически, геттеры и сеттеры позволяют использовать стандартную нотацию доступа к свойствам для чтения и записи, сохраняя при этом возможность настраивать способ извлечения и изменения свойства без необходимости явного геттера и сеттера методы.
в классе сотрудников выше, это будет означать, что вы можете получить доступ к
name
вот так:console.log(someEmployee.name);
это посмотреть как обычный доступ к свойству, но это на самом деле вызов
toUpperCase
на имя прежде, чем возвратить это. Аналогично, делая это:someEmployee.name = null;
будет доступ к сеттеру, и он не будет изменять внутренний
_name
свойство из-за предложения guard, введенного вname
С сеттером.посмотреть также общий вопрос зачем использовать геттеры и сеттеры? для получения дополнительной информации о том, почему возможность изменять функциональность доступа к члену является полезным.
ES6 геттеры и сеттеры имеют существенно иную мотивацию, чем аналогичные концепции в Java.
в Java геттеры и сеттеры позволяют классу определять JavaBean. Точка геттеров и сеттеров заключается в том, что она позволяет Бобу иметь полностью ортогональный "интерфейс" из того, что подразумевается публичными полями. Поэтому я могу иметь поле "имя", которое не является свойством JavaBean, и я могу иметь свойство JavaBean" адрес", которое не является полем.
JavaBean свойства также "обнаруживаются" тысячами фреймворков (например, Hibernate) через отражение Java. Таким образом, геттеры и сеттеры являются частью стандартного метода для "разоблачительного" свойства фасоли.
геттеры и сеттеры, будучи функциями, также имеют значение, которое они "абстрагируют" от реализации. Это может быть либо поле, либо вычисленное ("синтетическое") значение. Поэтому, если у меня есть свойство bean под названием "zipcode", которое начинается как сохраненная строка. Теперь предположим, что я хочу изменить его на быть значением, вычисленным из адреса / города / штата?
Если я использую поле, этот код ломает:
String zipcode = address.zipcode();
но если я использую геттер, это не ломается:
String zipcode = address.getZipcode();
JavaScript не имеет ничего похожего на JavaBeans. Насколько я читал, Предполагаемое значение GET и SET ограничено вышеупомянутыми "синтетическими" (вычисленными) свойствами.
но это несколько лучше, чем java, в то время как Java не позволяет совместимо конвертировать "поле" в a метод, ES6 GET и SET позволяет это.
то есть, если у меня есть:
var zipcode = address.zipcode;
Если я изменю zipcode из стандартного свойства объекта в геттер, приведенный выше код теперь вызывает функцию GET.
обратите внимание, что если бы я не включил GET в определение, это не вызвало бы метод GET zipcode. Вместо того, что бы просто присвоить адрес функции дисп.
поэтому я думаю, что это некоторые важные различия для понимания между Java и JavaScript ES6 геттеры и сеттеры.