Classes

Création d'une classe

ES6 Class
Legacy Prototype
ES6 Class
class Customer {
​
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
getName() {
return this.firstName;
}
​
}
Legacy Prototype
var Customer = function(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
​
Customer.prototype = {
getName: function () {
return this.firstName;
}
}
​

Visibilité

En attendant la notion de class fields qui sera probablement bientôt introduite en ECMAScript 2019 http://kangax.github.io/compat-table/esnext/, la notion de visibilité private se base sur la convention de nommage qui consiste à préfixer la propriété ou la méthode par le caractère underscore : _

class Customer {
​
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.email = null;
this._isBadPayer = this._tellIfBadPayer();
}
getName() {
return this.firstName;
}
_tellIfBadPayer() {
return this.firstName === 'foo';
}
​
}

Propriétés

class Customer {
​
constructor(firstName, lastName) {
this.firstName = firstName;
}
​
get firstName() {
return this._firstName;
}
set firstName(value) {
this._firstName = value;
}
}
​
/* @HACK: Last time we use var, I promise! */
var customer = new Customer();
​
customer.firstName = 'Foo';
​
console.log(customer.firstName); // Foo

Ne les utilisez pas.

L'implémentation de propriétés peut s'avérer pratique dans certains cas extrêmes tels que l'intégration d'une librairie "legacy", mocking, décoration pour "type checking" etc...

Autrement, cela introduit surtout de l'ambiguité dans le code.

Qui pourrait imaginer que le code suivant puisse lever une exception ?

var customer = new Customer();
element.textContent = customer.name;

Ou pire encore :

/* @HACK: Do not remove this useless line as it initializes
* the user eagerly instead of running it lazily. */
request.user;

Toute ressemblance avec du code existant est fortuite.

Héritage

export class WishtackProduct extends Product {
​
...
​
getProductId() {
return 'wishtack-' + this._wishtackId;
}
​
}

Evitez l'héritage...

... et préférez la composition !

Bonnes pratiques

En l'absence de notion de "class fields", il est recommandé d'initialiser toutes les attributs dans le constructeur. Autrement, il est difficile de déterminer les attributs d'une classe et les attributs présents sur une instance dépendront alors des méthodes appelées.

​