为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕工程0101907 2019-12-06 11:08:22
我想做这样的事情:const vegetableColors = {corn: 'yellow', peas: 'green'};const {*} = vegetableColors;console.log(corn);// yellowconsole.log(peas);// green我似乎无法找到或弄清楚该怎么做,但我真的以为我以前看过它!:P注:我使用的是巴贝尔与stage设置为0;语境:我试图在JSX中变得更干燥,而不是引用this.state或this.props无处不在。而且,如果数据发生更改,也不必继续添加属性以进行解构。
查看完整描述

3 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

我认为您正在寻找该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否决:-)


查看完整回答
反对 回复 2019-12-06
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我认为您正在寻找:


const {corn, peas} = vegetableColors;

依靠Babel的REPL直播


如果Pointy是对的,那么您在不知道cornand 的名称的情况下询问如何执行此操作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引用了全局对象。


查看完整回答
反对 回复 2019-12-06
?
桃花长相依

TA贡献1860条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 341 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信