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

时间:2015-08-09 19:19:23

标签: javascript ecmascript-6 destructuring ecmascript-7

我想做这样的事情:

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

const {*} = vegetableColors;

console.log(corn);// yellow
console.log(peas);// green

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

注意:我使用Babel并将stage设置为0;

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

3 个答案:

答案 0 :(得分:13)

我认为您正在寻找with statement,它正是您所要求的:

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

但是,已弃用(在严格模式下,包括ES6模块),理由充分。

  

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

你不能在ES6 1 And that's a good thing。明确你要引入的变量:

const {corn, peas} = vegetableColors;

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

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

答案 1 :(得分:2)

我想你正在寻找:

const {corn, peas} = vegetableColors;

Live on Babel's REPL

如果您Pointy's right询问如何执行此操作知道名称cornpeas,则无法进行解构分配。< / p>

您只能在全局范围内使用循环,但我确定您不希望在全局范围内执行此操作。不过,以防万一:

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

(如果你想让这些伪常数可枚举的话,在那里抛出enumerable: true。)

这适用于全局范围,因为this引用了全局对象。

答案 2 :(得分:1)

我不推荐这样做,但是您可以使用eval()完成类似的操作:

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

function test() {
    for ( let i=0; i < Object.keys(vegetableColors).length; i++ ) {
        let k = Object.keys(vegetableColors)[i];
        eval(`var ${k} = vegetableColors['${k}']`);
    }

    console.log(corn); // yellow
}

test();

console.log(corn); // undefined (out of scope)