当我有:
const foo = 1;
我可以设置对象属性名称的简写
const bar = {foo}
就像
一样const bar = {foo: foo} // bar will be {foo: 1}
当我有一个带箭头功能的const时会有一个简写吗?
const foo = () => 1
我必须像这样设置它,但它不冷却
const bar = {foo: foo()}
我想这样做或者更短的事情
const bar = {foo()} //bar should be {foo: 1} but this will fail
答案 0 :(得分:6)
查看specs,没有这方面的语法。
在您的情况下,ObjectLiteral
必须解析为{ PropertDefinitionList }
,PropertyDefinition
必须解析为PropertyDefinition
。现在IdentifierReference
可以做什么?
不能{f}
- 这是您的第一个例子:CoverInitializedName
。
{f = AssignmentExpression}
也不适合。这看起来像AssignmentExpression
,PropertyName: AssignmentExpression
定义为here。
{f: 1}
是传统语法:MethodDefinition
{f(){ return 1; }};
可让您{{1}},但这又不是您想要的。
看起来判决结果是否定的。
答案 1 :(得分:1)
对称已经存在。 {foo}
等同于{foo: () => 1 }
,即包含属性foo的对象,该属性是函数。例如。如果你愿意,你可以这样称呼它:
bar.foo();
您的请求似乎是针对新语法,而是调用foo
并使用结果填充bar.foo
。 没有这样的语法。如果foo
接受参数怎么办?如果foo
是异步的(您之前想要使用await
)会怎样?你是如何得到与属性同名的函数的?如果没有经过验证的用例,很难看出在优化此模式时有任何价值。
较短并不总是更具可读性。
如果您有一组专用于为一组同名属性提供结果的函数,您可以使用mapObject帮助器构造一些东西,如下所示:
const mapObj = (o, f) => Object.assign({}, ...Object.keys(o).map(k => ({[k]: f(o[k])})));
const foo = () => 1;
const fum = () => 2;
let bar = mapObj({foo, fum}, f => f());
console.log(JSON.stringify(bar));

答案 2 :(得分:0)