2016-03-03 2 views
4

С ES6, я могу создать новый объект с функциями, как следующее:Разница между назначением метода объекта ES6: a, 'a' и ['a']?

var obj = { 
    something() {} 
}; 

Это имеет смысл. Но я также могу это сделать:

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

Или я могу это сделать:

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

Есть ли разница между этими тремя синтаксисами? Почему все эти синтаксически действительны?

+0

wow. Я не знал, что вы можете '['x']' в литерале. –

+0

Действительно любопытно, будет ли когда-либо польза от использования последней. – Chris

+0

@Chris: Да: вы можете сделать '[Math.random()]' – apscience

ответ

6

Есть ли разница между этими тремя синтаксисами?

Не соответствует результатам в вашем примере.

Однако различные синтаксисы имеют разные характеристики. Путь имя свойства определяются не является специфичным для определения методов КСТАТИ правила применяются ко всем именам свойств:

  • имен объектов, которые являются действительными именами идентификаторов или числа литералов не должен быть указано:

    { 
        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

Как оказалось, вы можете сделать '['foo' + someFunction()]' с помощью скобок и имеют динамические (on-creation) имена свойств. Аккуратный трюк. – 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() {}}; 'также действителен. –

Смежные вопросы