如何在ES2015中将所有属性解构为当前范围/闭包?

Res*_*ign 21 javascript destructuring ecmascript-6 ecmascript-7

我想做这样的事情:

const vegetableColors = {corn: 'yellow', peas: 'green'};

const {*} = vegetableColors;

console.log(corn);// yellow
console.log(peas);// green
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到或弄清楚如何做到这一点,但我真的以为我以前见过它!:P

注:我使用的是巴贝尔stage设置为0;

背景:我正试图在JSX中干燥而不是参考this.statethis.props在任何地方.如果数据发生变化,也不必继续为destructure添加属性.

Ber*_*rgi 15

我认为你正在寻找with声明,它正是你所要求的:

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

但是,它被弃用(在严格模式下,包括ES6模块),这是有充分理由的.

将所有属性解构为当前范围

你不能在ES6 1.这是一件好事.明确你要引入的变量:

const {corn, peas} = vegetableColors;
Run Code Online (Sandbox Code Playgroud)

或者,您可以扩展全局对象Object.assign(global, vegetableColors)以将它们放在全局范围内,但实际上,这比with语句更糟糕.

1:......虽然我不知道在ES7中是否有草案允许这样的事情,但我可以告诉你任何提案都会被TC核实:-)

  • 我知道`with`并且我永远不会使用它,但它正是我要求的......废话!我在想什么!?:P (2认同)
  • 我不同意这是一件好事。当然,*可能*很危险。这也可能正是程序员想要做的。他应该能够自己做出选择。并不是说javascript作为一种语言就采取了坚决的设计立场,以反对任何使您无法自拔的事情。 (2认同)
  • @Jonah:严格模式*是*针对脚射和优化预防功能的设计立场:-)如果您愿意,您仍然可以使用“with”,它不会从语言中删除(主要是出于向后兼容性问题)尽管)。 (2认同)