web-dev-qa-db-fra.com

Impossible de définir la propriété ... qui n'a que Getter (javascript es6)

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?

6
user7446944

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);
1
Randy Casburn

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.

1
Pointy
class MyClass 
{
    constructor(x) {
        this.x = x === undefined ? 0 : x;
    }

    get() {
        return this.x;
    } 

    set(x) { return this.x = x;}
}
0
Nikolay Vetrov