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;
    }
}
Module 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
Utilisation du module

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;
}