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

IT技术 javascript ecmascript-6 destructuring ecmascript-2016
2021-01-23 13:12:03

我想做这样的事情:

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

const {*} = vegetableColors;

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

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

注意:我使用Babelstage设置为0;

上下文:我试图在JSX 中变得更干燥,而不是参考this.statethis.props无处不在。如果数据发生变化,也不必继续添加属性来解构。

3个回答

我认为您正在寻找withstatement,它完全符合您的要求:

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

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

将所有属性解构到当前作用域中

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

const {corn, peas} = vegetableColors;

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

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

其实我只记得我以前的答案,也没有this立即考虑:-)
2021-03-13 13:12:03
我知道with并且我永远不会使用它,但这正是我所要求的......废话!我在想什么!?:P
2021-03-14 13:12:03
呃,我仍然认为这将是一个有用的功能,但我可以看到争论的另一面。在任何情况下,with都不是“解决方案”imo,因为现在您必须将整个module包装起来with并添加级别缩进,这比将对象名称添加到每个函数调用或在顶部按名称导入所有内容更糟糕解构。
2021-03-28 13:12:03
@Jonah:严格模式针对射门和防止优化功能的设计立场:-)with如果需要,您仍然可以使用,它不会从语言中删除(尽管主要是出于向后兼容性问题)。
2021-04-05 13:12:03
我不同意这是一件好事。当然,这可能很危险。这也可能正是程序员想要做的。他应该能够自己做出选择。并且 javascript 作为一种语言并没有采取强硬的设计立场来反对任何让您在脚下开枪的东西。
2021-04-10 13:12:03

我认为您正在寻找:

const {corn, peas} = vegetableColors;

在 Babel 的 REPL 上直播


如果Pointy 是正确的,您在知道名称corn和的情况询问如何执行此操作peas,则您不能使用解构赋值。

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

// 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指的是全局对象。

@Pointy:我为你的问题添加了一个上下文:)
2021-03-13 13:12:03
或者,您可能想要解压缩 100 个属性,而不必显式命名所有属性,也不必在每次向对象添加新属性时更新列表。
2021-03-20 13:12:03
认为OP 正在寻找的是一种将对象的属性解包为同名局部变量的方法,而无需对源对象有任何预知。(我无法想象它的用途是什么。)
2021-03-23 13:12:03

我不推荐它,但你可以用它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)