2016-03-03 144 views
4

随着ES6,我可以创造一个新的对象中包含以下功能:ES6对象方法分配之间的区别:a,'a'和['a']?

var obj = { 
    something() {} 
}; 

这是有道理的。但我也可以这样做:

var obj = { 
    'something'() {} 
}; 

或者,我可以这样做:

var obj = { 
    ['something']() {} 
}; 

是否有这三个语法之间的区别吗?为什么这些语法都有效?

+0

哇。我不知道你可以在文字中使用'['x']。 –

+0

真的很好奇,如果使用最后一个会有什么好处。 – Chris

+0

@Chris:是的:你可以做'[Math.random()]' – apscience

回答

6

这三种语法有区别吗?

不适用于您的示例中的结果。

但是,不同的语法确实具有不同的特征。属性名称定义的方法是不特定于BTW方法定义的规则适用于所有属性名称:

  • 的属性名是有效的标识符名称或数字文字不需要被引用:

    { 
        foo: ..., 
        10e4: ..., 
        if: ..., 
    } 
    
  • 还有什么需要被表示:

    { 
        'foo+bar': ..., 
        'abc def': ..., 
        '123,45': ..., 
    } 
    
  • 的平方uare支架语法ES6是新的,允许你动态地计算属性名称:

    { 
        [getPropertyName()]: ..., 
        ['item' + (i * 3)]: ..., 
    } 
    

为什么所有这些语法有效?

因为grammar允许它:

MethodDefinition : 
    PropertyName (StrictFormalParameters) { FunctionBody } 
    GeneratorMethod 
    get PropertyName () { FunctionBody } 
    set PropertyName(PropertySetParameterList) { FunctionBody } 

PropertyName : 
    LiteralPropertyName 
    ComputedPropertyName 

LiteralPropertyName : 
    IdentifierName 
    StringLiteral 
    NumericLiteral 

ComputedPropertyName : 
    [ AssignmentExpression ] 

(不知道你期待什么样的回答在这里)

如果考虑方法等同于对财产分配功能,似乎有道理将相同的规则应用于属性名称到函数/方法名称。

+0

事实证明,你可以做'[ '富' + someFunction()]'用支架和具有动态(创建中)属性名称。整洁的把戏。 – apscience

+0

“*除了函数名*” - 甚至不应该这是一样的吗? – Bergi

+0

@Bergi:我的意思是georg在他的回答中指出了什么。最后一个没有设置函数的名字。我应该澄清一点。 –

2

第一和第二是相同的,并执行相同

obj.something = function something() {} 

第三个创造了obj.something匿名函数,并将其存储。这是一个等价于:

obj['something'] = function() {} 

行情允许创建密钥(因此函数名)不在JS有效的标识符,例如:

var obj = { 
    '123'() {} 
}; 

名为123创建了一个函数,信不信由你。

的方括号语法允许任意表达式,所以你可以做

var obj = { 
    ['myfunc_' + getFuncName()]() {} 
} 

和类似很酷的事情。

+0

*“......并且做同样的...”*除了'something'没有被绑定在函数内部。 –

+3

@zerkms:是:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-method-definitions-runtime-semantics-propertydefinitionevaluation(步骤3) –

+0

FWIW,'VAR OBJ = {123(){}};'也是有效的。 –

相关问题