如何在ES2015中将所有属性分解为当前作用域/封闭关系?

我想做这样的事情:

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


const {*} = vegetableColors;


console.log(corn);// yellow

console.log(peas);// green

我似乎无法找到或弄清楚该怎么做,但我真的以为我以前看过它!:P


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


语境:我试图在JSX中变得更干燥,而不是引用this.state或this.props无处不在。而且,如果数据发生更改,也不必继续添加属性以进行解构。


慕工程0101907
浏览 344回答 3
3回答

catspeake

我认为您正在寻找该with声明,它完全符合您的要求:const vegetableColors = {corn: 'yellow', peas: 'green'};with (vegetableColors) {    console.log(corn);// yellow    console.log(peas);// green}但是,有充分的理由不建议使用(在严格模式下,其中包括ES6模块)。将所有属性分解为当前范围您无法在ES6 1中使用。那是一件好事。明确说明要引入的变量:const {corn, peas} = vegetableColors;另外,您可以使用扩展全局对象Object.assign(global, vegetableColors)以将它们置于全局范围内,但实际上,这比with声明要糟糕。1:…虽然我不知道ES7中是否有允许这种事情的草案,但我可以告诉您,任何提案都会被TC否决:-)

肥皂起泡泡

我认为您正在寻找:const {corn, peas} = vegetableColors;依靠Babel的REPL直播如果Pointy是对的,那么您在不知道cornand 的名称的情况下询问如何执行此操作peas,则无法进行销毁分配。您只能使用循环在全局范围内进行操作,但是我确定您不想在全局范围内执行此操作。不过,以防万一:// I'm sure you don't really want this, just being thoroughObject.keys(vegetableColors).forEach((key) => {    Object.defineProperty(this, key, {        value: vegetableColors[key]    });});(enumerable: true如果希望这些伪常量可枚举,则在该处抛出。)这在全局范围内有效,因为this引用了全局对象。

桃花长相依

我仍然认为这将是一个有用的功能,但是我可以看到论点的另一面。在任何情况下,with它都不是“解决方案”的imo,因为现在您必须包装整个模块with并添加级别缩进,这比在每个函数调用前添加对象名称或在顶部使用名称导入所有内容都更糟糕。破坏。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript