Javascript : champ en lecture seule mais modifiable à l'intérieur d'un module
Une propriété publique en lecture seule doit parfois être modifiée, mais uniquement par du code qui « en aurait le droit ». Voici une manière, parmi d'autres, de le faire...
Soit une classe quelconque possédant une propriété en lecture seule, quelque chose comme ce qui suit :
export default class MyItem {
#privateField = 25;
get field() {
return this.#privateField;
}
}
MyItem.js
import MyItem from '/path/to/MyItem.js';
// Création d'une instance
const instance = new MyItem();
// lecteur du champ: ok
console.log(instance.field); // => field = 25
// Modification du champ: ko
instance.field = 30; // => field = 25
Imaginons maintenant que certaines actions obligent à modifier cette valeur mais que cette modification ne doit être autorisée que dans le module. On ne parle pas de traitement interne à l'objet lui-même qui peut, par définition, modifier tous les champs de l'objet, y compris les privés, mais bien d'un traitement externe à l'instance… Quelque chose comme l'équivalent du protected
java.
Une manière de l'implémenter serait d'activer le setter de la propriété mais de correler son action à l'état d'un flag par exemple :
let updateAllowed = false;
export default class MyItem {
#privateField = 25;
get field() {
return this.#privateField;
}
set field(newValue) {
if (updateAllowed) {
this.#privateField = newValue;
}
}
}
const updateField = (myItemInstace, newValue) => {
updateAllowed = true;
myItemInstace.field = newValue;
updateAllowed = false;
}