Что такое геттеры и сеттеры для классов 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;
}
}
}
Ответы
Ответ 1
Эти сеттер и геттер позволяют использовать свойства напрямую (без использования скобок)
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
Это только для установки и получения значения свойства.
Ответ 2
Getters и seters в ES6 выполняют ту же цель, что и на других языках... включая ES5. ES5 уже позволяет использовать геттеры и сеттеры через Object.defineProperty
, хотя они менее чисты и более громоздки в использовании.
Эффективно, получатели и сеттеры позволяют использовать стандартную номенклатуру доступа к свойствам для чтения и записи, сохраняя при этом возможность настраивать способ получения и изменения свойств без необходимости использования явных методов getter и setter.
В вышеприведенном классе Employee это означает, что вы можете получить доступ к свойству name
следующим образом:
console.log(someEmployee.name);
Он будет выглядеть как обычный доступ к свойствам, но на самом деле он вызовет toUpperCase
в имени перед его возвратом. Аналогичным образом:
someEmployee.name = null;
будет обращаться к установщику и не будет изменять внутреннее свойство _name
из-за предложения охраны, введенного в установщик name
.
См. также общий вопрос Зачем использовать геттеры и сеттеры? для получения дополнительной информации о том, почему возможность изменять функциональность доступа членов является полезной.