Quelles sont les règles et les règles pour les classes ECMAScript 6?

Je suis confus quant à la raison d’être des getters et des régleurs dans les classes ECMAScript 6. Quel est le but? Voici un exemple auquel je fais référence:

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 directement les propriétés (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 installateurs d’ES6 ont le même objective que dans d’autres langages … y compris ES5. ES5 permet déjà aux getters et aux Object.defineProperty via Object.defineProperty , bien qu’ils soient moins propres et plus lourds à utiliser.

En effet, getters et setters vous permettent d’utiliser la notation d’access aux propriétés standard pour les lectures et les écritures tout en ayant la possibilité de personnaliser la manière dont la propriété est extraite et mutée sans les méthodes getter et setter explicites nécessaires.

Dans la classe Employé ci-dessus, cela signifie que vous pouvez accéder à la propriété name comme ceci:

 console.log(someEmployee.name); 

Cela ressemblerait à un access de propriété normal, mais il appellerait en fait le nom d’ toUpperCase avant de le renvoyer. De même, en faisant ceci:

 someEmployee.name = null; 

accède au setter et ne modifie pas la propriété interne _name cause de la clause guard introduite dans le setter de name .

Voir aussi la question générale Pourquoi utiliser des getters et des setters? Pour plus d’informations sur les raisons pour lesquelles il est utile de pouvoir modifier les fonctionnalités de l’access des membres.

Les formateurs et les formateurs ES6 ont une motivation sensiblement différente de celle des concepts similaires en Java.

En Java, les getters et les setters permettent à une classe de définir un JavaBean. Le but des getters et des setters est de permettre au haricot d’avoir une “interface” complètement orthogonale par rapport aux champs publics. Donc, je peux avoir un champ “name” qui n’est pas une propriété JavaBean, et je peux avoir une propriété JavaBean “address” qui n’est pas un champ.

Les propriétés JavaBean sont également “découvrables” par milliers de frameworks (Hibernate par exemple) via la reflection Java. Ainsi, les getters et les setters font partie d’une méthode standard pour “exposer” les propriétés des haricots.

Les getters et les setters, en tant que fonctions, ont également la valeur qu’ils «abstraite» la mise en œuvre. Cela peut être soit un champ, soit une valeur calculée (“synthétique”). Donc, si j’ai une propriété Bean appelée “zipcode”, elle commence par une chaîne stockée. Supposons maintenant que je veuille changer cette valeur pour qu’elle soit calculée à partir de l’adresse / ville / état?

Si j’utilise un champ, ce code casse:

  Ssortingng zipcode = address.zipcode(); 

Mais si j’utilise un getter, cela ne casse pas:

  Ssortingng zipcode = address.getZipcode(); 

JavaScript n’a rien comme JavaBeans. Pour autant que je sache, la valeur prévue de GET et SET est limitée aux propriétés “synthétiques” précitées.

Mais c’est un peu mieux que Java car Java ne vous permet pas de convertir de manière compatible un “champ” en une méthode, ES6 GET et SET le permet.

C’est-à-dire si j’ai:

  var zipcode = address.zipcode; 

Si je change le code postal qui devient une propriété d’object standard en 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’invoquerait PAS la méthode GET du code postal. Au lieu de cela, il affecterait simplement la fonction zipcode au var.

Donc, je pense que ce sont quelques distinctions importantes à comprendre entre Java et JavaScript ES6 getters et setters.