Comment déstructurer toutes les propriétés dans la portée / fermeture actuelle dans ES2015?

J'aimerais faire quelque chose comme ça:

const vegetableColors = {corn: 'yellow', peas: 'green'}; const {*} = vegetableColors; console.log(corn);// yellow console.log(peas);// green 

Je ne peux pas trouver ou comprendre comment faire cela, mais j'ai vraiment pensé que je l'avais vu quelque part auparavant! : P

REMARQUE: J'utilise Babel avec un stage réglé sur 0 ;

CONTEXT: J'essaie d'être plus sec dans JSX et ne this.state pas référence à this.state ou this.props partout. Et ne doit pas non plus continuer à ajouter des propriétés à destructure si les données changent.

Je pense que vous cherchez la déclaration with , il fait exactement ce que vous demandez:

 const vegetableColors = {corn: 'yellow', peas: 'green'}; with (vegetableColors) { console.log(corn);// yellow console.log(peas);// green } 

Cependant, il est obsolète (en mode strict, qui comprend les modules ES6), pour une bonne raison.

Déstructurer toutes les propriétés dans la portée actuelle

Vous ne pouvez pas dans ES6 1 . Et c'est une bonne chose . Soyez explicite sur les variables que vous présentez:

 const {corn, peas} = vegetableColors; 

Alternativement, vous pouvez étendre l'objet global avec Object.assign(global, vegetableColors) pour les mettre dans la portée globale, mais vraiment, c'est pire qu'avec une déclaration.

1: … et même si je ne sais pas s'il y a un brouillon pour permettre de telles choses dans ES7, je peux vous dire que toute proposition sera soumise au TC 🙂

Je pense que tu es à la recherche:

 const {corn, peas} = vegetableColors; 

Live on Babel's REPL


Si Pointy a raison , vous demandez comment faire cela sans connaître les noms de corn et de peas , vous ne pouvez pas avec une tâche de déstructuration.

Vous pouvez uniquement à l'échelle mondiale, en utilisant une boucle, mais je suis sûr que vous ne voulez pas le faire à l'échelle mondiale. Pourtant, dans le cas où:

 // I'm sure you don't really want this, just being thorough Object.keys(vegetableColors).forEach((key) => { Object.defineProperty(this, key, { value: vegetableColors[key] }); }); 

(Lancer enumerable: true là-bas si vous voulez que ces pseudo-constantes soient énumérables).

Cela fonctionne à l'échelle mondiale parce que this réfère à l'objet global.