问题 如何在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 到处。如果数据发生变化,也不必继续为destructure添加属性。


1471
2017-08-09 19:19


起源

请尝试找到你之前看过的地方,我很乐意阅读那篇文章 - Bergi
假设你可以这样做。那么,下一个陈述是什么?如果你事先不知道他们的名字是什么,你会如何编写使用从这种声明中弹出的变量的代码? - Pointy
@Pointy,重点是,如果您使用的是像下划线或ramda这样的实用程序库,那么每次使用时,都不会不断地返回到文件顶部并编辑按名称导入函数的行。新的(或前 _. 要么 R. 到每个函数调用)。 - Jonah
@Jonah听起来像一个严重的代码味道。无缘无故地污染你的命名空间似乎是持续潜在灾难的一个秘诀。 - Pointy
@Pointy,你是说你不熟悉一些实用程序库而只是希望能够使用它的功能吗?如果 您 写了这个图书馆?什么是这场“潜在的灾难”?那你忘记了库有一些叫做X的函数吗? - Jonah


答案:


我想你正在寻找 with 声明,它完全符合您的要求:

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

但是,确实如此 弃用 (在严格模式下,包括ES6模块),有充分的理由。

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

你不能在ES61这是一件好事。明确你要引入的变量:

const {corn, peas} = vegetableColors;

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

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


11
2017-08-09 19:30



实际上我只记得我的老答案,并没有想到 this 立即:-) - Bergi
我知道 with我永远不会使用它,但它正是我要求的......废话!我在想什么!? :P - Resist Design
我不同意这是一件好事。当然,它 威力 很危险它也可能正是程序员想要做的。他应该能够自己做出选择。并不是说javascript作为一种语言,已经采取了坚硬的设计立场来反对让你自己开枪的任何东西。 - Jonah
@Jonah:严格的模式 是 针对脚射击和优化防止功能的设计立场:-)你仍然可以使用 with 如果你愿意,它不会从语言中删除(尽管主要是为了向后兼容性问题)。 - Bergi
呃,我仍然认为这将是一个有用的功能,但我可以看到论点的另一面。任何状况之下, with 不是一个“解决方案”imo,因为现在你必须包装你的整个模块 with 并添加一个级别缩进,这比将对象名称添加到每个函数调用或者通过解析在顶部按名称导入所有内容更糟糕。 - Jonah


我想你正在寻找:

const {corn, peas} = vegetableColors;

生活在巴贝尔的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 指全局对象。


2
2017-08-09 19:24



一世 认为 OP正在寻找的是一种将对象的属性解包为类似命名的局部变量的方法,而无需预先知道源对象。 (我无法想象它的用途是什么。) - Pointy
@Pointy:我在这个问题上添加了一个上下文:) - Resist Design