web-dev-qa-db-fra.com

que sont réellement les getter et les setter de classe ES6

quelles sont en réalité les méthodes getter et setter dans la définition de classe ES6? Sont-ils infact prototypes accessoires? par exemple:

class Person{
  constructor(){};
  get name(){
    return 'jack';
  }
  set name(){
    // ???
  }
}

cela équivaut-il à Person.prototype.name = 'jack';

et une autre question, j'ai vu des exemples de setters qui utilisent l'accessoire de l'instance comme:

class Person{
  constructor(){
    this._name = 'jack';
  };
  get name(){
    return this._name;
  }
  set name(val){
    this._name = val;
  }
}

je ne veux pas faire de cette façon, je veux quelque chose comme: 

class Person{
  constructor(){};
  get name(){
    return 'jack';
  }
  set name(val){
    // like this
    // name = val;
  }
}

que pourrait-on faire?

8
feiyuerenhai

Oui, cela peut être fait: supprimez simplement la syntaxe setter/getter et ajoutez une propriété à la classe lors de l'initialisation:

class Person{
    constructor(name){
        this.name = name;
    }
}

La syntaxe getter/setter existe pour les propriétés devant être calculées en fonction d'autres propriétés, comme la propriété area à partir du cercle d'une radius donnée:

class Circle {
    constructor (radius) {
        this.radius = radius;
    }
    get area () {
        return Math.PI * this.radius * this.radius;
    }
    set area (n) {
        this.radius = Math.sqrt(n / Math.PI);
    }
}

Ou obtenir le nom complet d'un objet Person avec les propriétés firstName et lastName. Vous avez eu l'idée.

16
Tiago Marinho

Selon MDN, la syntaxe get lie une propriété d'objet à une fonction qui sera appelée lors de la recherche de cette propriété.

Ici, vous retournez juste une chaîne 'jack' qui ne lie aucune propriété.

Fait intéressant, console.log (Person.prototype.name) enregistre la prise

Mais Person.hasOwnProperty (name) enregistre false

également une fois que nous avons créé une instance d’appel de personne, c’est-à-dire const x = new Person ();

console.log (x.name) -> cette erreur génère une erreur, impossible de lire la propriété x.name car x.hasOwnProperty (name) a la valeur false

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get

2
Rafique Ahmed