J'ai donc une classe Javascript simple
class MyClass {
constructor(x) {
this.x = x === undefined ? 0 : x;
}
get x() {
return this.x;
}
}
Quand une MyClass est créée, je veux que son x soit défini sur la valeur transmise en tant que paramètre. Après cela, je ne veux pas qu'il puisse être modifié, donc je n'ai intentionnellement pas fait de méthode set x().
Cependant, je suppose que je dois manquer quelque chose de fondamental, car cela me donne l'erreur "Impossible de définir la propriété ... qui n'a que getter".
Comment attribuer une valeur à x sans créer de méthode de définition?
Si vous voulez créer une propriété immuable a
au sein de votre définition de classe, ceci est une façon de le faire avec la méthode que JavaScript donne est de le faire (en utilisant Object.defineProperty()
).
class MyClass {
constructor(x) {
Object.defineProperty(this, 'a', {
enumerable: false,
configurable: false,
writable: false,
value: x || 'empty'
});
}
}
let o = new MyClass('Hello');
console.log(o.a);
o.a = 'Will not change';
console.log(o.a);
Si vous souhaitez qu'une propriété d'instance soit en lecture seule, rendez-la non accessible en écriture:
class MyClass {
constructor(x) {
Object.defineProperty(this, "x", { value: x || 0 });
}
}
Une propriété peut être soit une propriété "simple", comme toutes les propriétés l'étaient jadis, soit une propriété getter/setter.
Lorsqu'une propriété est une propriété getter/setter, toutes les références à la propriété passent par le getter ou le setter, y compris à partir des fonctions getter et setter. Ainsi, pour stocker la propriété, vous devez utiliser un autre nom de propriété ou (mieux) une instance de Symbol.
class MyClass
{
constructor(x) {
this.x = x === undefined ? 0 : x;
}
get() {
return this.x;
}
set(x) { return this.x = x;}
}