对象属性名称的箭头函数的简写

时间:2018-05-04 16:44:06

标签: javascript ecmascript-6

当我有:

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

3 个答案:

答案 0 :(得分:6)

查看specs,没有这方面的语法。

enter image description here

在您的情况下,ObjectLiteral必须解析为{ PropertDefinitionList }PropertyDefinition必须解析为PropertyDefinition。现在IdentifierReference可以做什么?

不能{f} - 这是您的第一个例子:CoverInitializedName

{f = AssignmentExpression}也不适合。这看起来像AssignmentExpressionPropertyName: 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)

好的,我忘记了箭头功能也可以IIFE

所以如果你喜欢这种速记的好处,你可以做到

const foo = (() => 1)()
const bar = {foo}

缺点:你需要一个IIFE