Différence entre l'affectation de méthode objet ES6: a, 'a' et ?

Avec ES6, je peux créer un nouvel objet avec des fonctions comme suit:

var obj = { something() {} }; 

Ça a du sens. Mais je peux aussi faire ceci:

 var obj = { 'something'() {} }; 

Ou je peux le faire:

 var obj = { ['something']() {} }; 

Y a-t-il une différence entre ces trois syntaxes? Pourquoi sont-ils syntaxiquement valides?

Y a-t-il une différence entre ces trois syntaxes?

Pas en avance sur les résultats dans votre exemple.

Cependant, les différentes syntaxes ont des caractéristiques différentes. La façon dont le nom de propriété est définie n'est pas spécifique aux définitions de méthode btw, les règles s'appliquent à tous les noms de propriété:

  • Les noms de propriété qui sont des noms d'identifiants valides ou des littéraux numériques ne doivent pas être cités:

     { foo: ..., 10e4: ..., if: ..., } 
  • Toute autre chose à citer:

     { 'foo+bar': ..., 'abc def': ..., '123,45': ..., } 
  • La syntaxe du crochet est nouvelle dans ES6 et vous permet de calculer dynamiquement les noms de propriétés:

     { [getPropertyName()]: ..., ['item' + (i * 3)]: ..., } 

Pourquoi sont-ils syntaxiquement valides?

Parce que la grammaire le permet:

 MethodDefinition : PropertyName ( StrictFormalParameters ) { FunctionBody } GeneratorMethod get PropertyName ( ) { FunctionBody } set PropertyName( PropertySetParameterList ) { FunctionBody } PropertyName : LiteralPropertyName ComputedPropertyName LiteralPropertyName : IdentifierName StringLiteral NumericLiteral ComputedPropertyName : [ AssignmentExpression ] 

(Pas sûr de quel type de réponse vous attendez ici)

Si vous considérez que les méthodes équivalent à attribuer une fonction à la propriété, il semble logique d'appliquer les mêmes règles pour les noms de propriétés aux noms de fonctions / méthodes.

Les premier et deuxième sont les mêmes et font de même

 obj.something = function something() {} 

Le troisième crée une fonction anonyme et l'enregistre en quelque sorte. C'est un équivalent de ceci:

 obj['something'] = function() {} 

Les citations permettent de créer des clés (et donc des noms de fonctions) qui ne sont pas des identifiants valides dans JS, par exemple:

  var obj = { '123'() {} }; 

Crée une fonction avec le nom 123 , croyez-le ou non.

La syntaxe des crochets permet des expressions arbitraires, donc vous pouvez faire

  var obj = { ['myfunc_' + getFuncName()] () {} } 

Et des choses cool similaires.