web-dev-qa-db-fra.com

super mot-clé inattendu ici

Selon l'initialiseur sténographique ES6, les 2 méthodes suivantes sont identiques:

Dans ES5

var person = {
  name: "Person",
  greet: function() {
     return "Hello " + this.name;
  }
};

Dans ES6

var person = {
  name: "Person",
  greet() {
     return "Hello " + this.name;
  }
};

La méthode ES6 est-elle en tout cas différente de la méthode précédente? Si ce n'est pas le cas, l'utilisation de "super" à l'intérieur devrait également être traitée comme égale, ce qui n'est pas vrai, veuillez voir ci-dessous deux variantes:

Ci-dessous les œuvres

let person = {
  greet(){
   super.greet(); 
  }
};

Object.setPrototypeOf(person, {
  greet: function(){ console.log("Prototype method"); }
});

person.greet();

Ci-dessous échoue

let person = {
  greet: function(){
   super.greet(); // Throw error: Uncaught SyntaxError: 'super' keyword unexpected here
  }
};

Object.setPrototypeOf(person, {
  greet: function(){ console.log("Prototype method"); }
});

person.greet();

La seule différence dans les 2 exemples ci-dessus est la façon dont nous déclarons la méthode salue en objet personne, qui devrait être la même. Alors, pourquoi obtenons-nous une erreur?

14
Ratnesh Lal

Alors, pourquoi obtenons-nous une erreur?

Parce que super n'est valide qu'à l'intérieur des méthodes . greet: function() {} est une propriété/fonction "normale", pas une méthode, car elle ne suit pas la syntaxe de la méthode.

Les différences entre une méthode et une définition de fonction normale sont:

  • Les méthodes ont un "HomeObject" qui leur permet d'utiliser super.
  • Les méthodes ne sont pas constructibles, c'est-à-dire qu'elles ne peuvent pas être appelées avec new.
  • Le nom d'une méthode ne devient pas une liaison dans la portée de la méthode (contrairement aux expressions de fonction nommées).
24
Felix Kling