Objets et structures de données
Utiliser des accesseurs (getters) et mutateurs (setters)
L'utilisation d'accesseurs et de mutateurs pour accéder aux données d'objets est préférable à l'accès direct aux propriétés. Pourquoi ? Voici une liste non organisée de raisons :
- Lorsqu'une fonctionnalité supplémentaire est nécessaire au-delà du simple accès aux propriétés, cela évite de rechercher et modifier tous les points d'accès dans le codebase.
- Simplifie l'ajout de validation pendant les opérations de
set. - Encapsule la représentation interne des données.
- Facilite l'ajout de journalisation et de gestion d'erreurs lors des accès et modifications.
- Permet le chargement différé des propriétés depuis un serveur.
Mauvais :
javascript
function makeBankAccount() {
// ...
return {
balance: 0
// ...
};
}
const account = makeBankAccount();
account.balance = 100;Bon :
javascript
function makeBankAccount() {
// this one is private
let balance = 0;
// a "getter", made public via the returned object below
function getBalance() {
return balance;
}
// a "setter", made public via the returned object below
function setBalance(amount) {
// ... validate before updating the balance
balance = amount;
}
return {
// ...
getBalance,
setBalance
};
}
const account = makeBankAccount();
account.setBalance(100);Rendre les membres des objets privés
Ceci peut être implémenté via des fermetures en ES5 et versions antérieures.
Mauvais :
javascript
const Employee = function(name) {
this.name = name;
};
Employee.prototype.getName = function getName() {
return this.name;
};
const employee = new Employee("John Doe");
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: undefinedBon :
javascript
function makeEmployee(name) {
return {
getName() {
return name;
}
};
}
const employee = makeEmployee("John Doe");
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe
delete employee.name;
console.log(`Employee name: ${employee.getName()}`); // Employee name: John Doe