class - объекты - встроенные классы javascript



Для чего нужны методы получения и установки в классах ECMAScript 6? (2)

Меня смущает вопрос о том, в чем смысл методов получения и установки в классах 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;
        }
    }
}

https://code.i-harness.com


Геттеры и сеттеры в ES6 служат той же цели, что и на других языках ... включая ES5. ES5 уже позволяет получать и Object.defineProperty через Object.defineProperty , хотя они менее чистые и более громоздкие в использовании.

По сути, методы получения и установки позволяют использовать стандартную запись доступа к свойству для чтения и записи, при этом имея возможность настраивать способ извлечения и изменения свойства без необходимости использования явных методов получения и установки.

В приведенном выше классе Employee это означает, что вы можете получить доступ к свойству name следующим образом:

console.log(someEmployee.name);

Это будет выглядеть как обычный доступ к свойству, но на самом деле вызовет toUpperCase для имени перед его возвратом. Аналогично делаем это:

someEmployee.name = null;

получит доступ к установщику и не изменит внутреннее свойство _name из-за предложения guard, введенного в установщик имени.

Смотрите также общий вопрос. Зачем использовать геттеры и сеттеры? для получения дополнительной информации о том, почему полезна возможность изменения функциональности членского доступа.


У геттеров и сеттеров 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 не позволяет вам совместимо преобразовывать «поле» в метод, ES6 GET и SET позволяют это.

То есть если у меня есть:

       var zipcode = address.zipcode;

Если я изменяю почтовый индекс со стандартного свойства объекта на геттер, вышеприведенный код теперь вызывает функцию GET.

Обратите внимание, что если бы я не включил GET в определение, это НЕ вызвало бы метод GET с почтовым индексом. Вместо этого он просто назначил бы почтовый индекс функции переменной.

Поэтому я думаю, что это несколько важных отличий для понимания методов получения и установки Java и JavaScript ES6.





getter