2016-03-03 76 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(){}};'也是有效的。 –

相關問題