Что такое геттеры и сеттеры для классов 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 85

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 геттеры и сеттеры.