Je suis confus quant à l’intérêt des getters et des setters dans les classes ECMAScript 6. Quel est le but? Voici un exemple auquel je me réfère:
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;
}
}
}
Ces setter et getter vous permettent d’utiliser les propriétés directement (sans utiliser la parenthèse)
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
Ceci est uniquement pour définir et obtenir la valeur de la propriété.
Les Getters et les setters dans ES6 ont le même objectif que dans d'autres langues ... y compris ES5. ES5 autorise déjà les geters et les setters via Object.defineProperty
, bien qu’ils soient moins propres et plus encombrants à utiliser.
Les getters et les setters vous permettent d'utiliser la notation d'accès aux propriétés standard pour les lectures et les écritures, tout en permettant de personnaliser le mode de récupération et de mutation de la propriété sans recourir aux méthodes explicites de getter et de setter.
Dans la classe Employee ci-dessus, cela signifie que vous pourriez accéder à la propriété name
comme ceci:
_console.log(someEmployee.name);
_
Cela ressemblerait à un accès de propriété normal, mais il appellerait en fait toUpperCase
sur le nom avant de le renvoyer. De même, ceci:
_someEmployee.name = null;
_
accéderait au setter et ne modifierait pas la propriété interne __name
_ en raison de la clause de protection introduite dans le setter de name
.
Voir aussi la question générale Pourquoi utiliser les getters et les setters? pour plus d'informations sur les raisons pour lesquelles il est utile de pouvoir modifier les fonctionnalités d'accès des membres.
Les getters et les setters ES6 ont une motivation substantiellement différente de celle de concepts similaires en Java.
En Java, les getters et les setters permettent à une classe de définir un JavaBean. L'intérêt des accesseurs et des setters est que cela permet au bean d'avoir une "interface" complètement orthogonale à partir de celle impliquée par les champs publics. Donc, je peux avoir un champ "nom" qui n'est PAS une propriété JavaBean et une propriété JavaBean "adresse" qui n'est PAS un champ.
Les propriétés JavaBean sont également "découvrables" par des milliers de frameworks (Hibernate par exemple) via Java reflet. Ainsi, les getters et les setters font partie d'une méthode standard pour "exposer" les propriétés du haricot.
Les accesseurs et les setters, en tant que fonctions, ont également la valeur d'abstraction de l'implémentation. Ce peut être SOIT un champ ou une valeur calculée ("synthétique"). Donc, si j'ai une propriété de bean appelée "zipcode", cela commence par une chaîne stockée. Supposons maintenant que je veuille en faire une valeur calculée à partir de l'adresse/ville/état?
Si j'utilise un champ, ce code casse:
String zipcode = address.zipcode();
Mais si j'utilise un getter, cela ne casse pas:
String zipcode = address.getZipcode();
JavaScript n'a rien comme JavaBeans. Pour le moment que j'ai lu, les valeurs attendues de GET et SET sont limitées aux propriétés "synthétiques" (calculées) mentionnées ci-dessus.
Mais c'est un peu mieux que Java en ce que bien que Java ne vous permette pas de convertir de manière compatible un "champ" en méthode, ES6 GET et SET le permettent.
C'est-à-dire si j'ai:
var zipcode = address.zipcode;
Si je remplace le code postal comme étant une propriété d'objet standard par un getter, le code ci-dessus appelle maintenant la fonction GET.
Notez que si je n'incluais pas GET dans la définition, cela n'appellerait PAS la méthode GET à code postal. Au lieu de cela, il assignerait simplement le code postal de la fonction à la var.
Je pense donc que ce sont des distinctions importantes à comprendre entre les getters et les setters Java et JavaScript ES6.