Class
Afin de simplifier la programmation des objets ECMAScript 2015 a introduit le mot-clé class. Ce n'est qu'un sucre syntaxique qui permet de générer plus facilement des objets ainsi que leur héritage.
Méthode : Création
Le mot-clé class permet de créer ce nouveau type de constructeur.
class Element {
constructor(prop1, prop2) {
this.prop1 = prop1;
this.prop2 = prop2;
}
meth1() {}
}
const enfant = new Element("valeur1", "valeur2");
On aurait pu créer cet objet de cette façon :
const Element = function(prop1, prop2){
this.prop1 = prop1;
this.prop2 = prop2;
}
Element.prototype.meth1 = function() {}
const enfant = new Element("valeur1", "valeur2");
Méthode : Propriété et méthode static
Création d'une méthode static
class Element {
constructor(prop1, prop2) {
this.prop1 = prop1;
this.prop2 = prop2;
}
static meth1() {}
}
const enfant = new Element("valeur1", "valeur2");
Element.meth1();
meth1 est une méthode static. C'est une méthode de classe.
On aurait pu créer cet objet de cette façon :
const Element = function(prop1, prop2){
this.prop1 = prop1;
this.prop2 = prop2;
}
Element.meth1 = function() {}
const enfant = new Element("valeur1", "valeur2");
Création d'une propriété static
class Element {
static prop = 0;
constructor(value) {
this.value = value;
Element.prop++;
}
}
const enfant1 = new Element(10);
const enfant2 = new Element(20);
const enfant3 = new Element(30);
console.log(Element.prop); // 3
prop est une propriété static. C'est une propriété de la classe.
Sa valeur augmente de 1 à chaque nouvelle instance.
Méthode : Héritage
Création d'héritage de class avec le mot-clé extends.
class Element {
constructor(prop1, prop2) {
this.prop1 = prop1;
this.prop2 = prop2;
}
}
class Enfant extends Element {
constructor(prop) {
super(prop, prop);
}
}
const petitEnfant = new Enfant("valeur1");
super représente la classe parente.
Pour appeler la méthode constructor de la classe parente on écrit super(...).
Pour appeler la méthode meth(...) de la classe parente on écrit super.meth(...).
On aurait pu créer cet objet de cette façon :
const Element = function(prop1, prop2){
this.prop1 = prop1;
this.prop2 = prop2;
}
const Enfant = function(prop){
Element.call(this,prop, prop);
}
Object.setPrototypeOf(Enfant.prototype, Element.prototype);
const petitEnfant = new Enfant("valeur1");
Méthode : Exemple
class Article {
valeur = 0;
constructor(nom, prix) {
this.nom = nom;
this.prix = prix;
Article.nombreArticles++;
}
get prix() {
return this.valeur + "€";
}
set prix(prix) {
this.valeur = parseFloat(prix);
}
static get nombreArticles(){
return this._nb || 0;
}
static set nombreArticles(nb){
this._nb = nb;
}
}
const art1 = new Article("art1", "12€");
const art2 = new Article("art2", "12.5€");
const art3 = new Article("art3", "1.8€");
console.log(Article.nombreArticles); // Affiche dans la console 3
Vérifiez les propriétés de vos objets :
Propriété nom de art1 :
Object.getOwnPropertyDescriptor(art1, 'nom')
{value: 'art1', writable: true, enumerable: true, configurable: true}
Propriété prix du prototype de art1 :
Object.getOwnPropertyDescriptor(art1.__proto__, 'prix')
{enumerable: false, configurable: true, get: ƒ, set: ƒ}
Propriété nombreArticles de la classe Article :
Object.getOwnPropertyDescriptor(art1.__proto__.constructor, 'nombreArticles')
ou en passant par art1
Object.getOwnPropertyDescriptor(Article, 'nombreArticles')
{enumerable: false, configurable: true, get: ƒ, set: ƒ}
Définition : Propriété et méthode de classe privées
Une proposition expérimentale de rendre les propriétés et les méthodes privés existe sur certaines versions de navigateurs (12/11/2022).
Il suffit de les faire précéder du symbole #.
class Article {
#valeur = 0;
constructor(nom, prix) {
this.nom = nom;
this.prix = prix;
Article.nombreArticles++;
}
get prix() {
return this.#valeur + "€";
}
set prix(prix) {
this.#valeur = parseFloat(prix);
}
static get nombreArticles(){
return this._nb || 0;
}
static set nombreArticles(nb){
this._nb = nb;
}
}
const art1 = new Article("art1", "12€");
L'utilisation de l'élément privé à l’extérieur de la classe déclenche une erreur de syntaxe.
console.log(art1.#valeur);
Uncaught SyntaxError: Private field '#valeur' must be declared in an enclosing class