2015-11-19 2 views
0

У меня есть проблемы со следующим кодом:Квадратные скобки после создания объекта

// At the beginning 
var prog = {} 
// some attributes of prog and other methods 
// ... 

prog.stateChange = function(state) 
{ 
    var functionOfState = 
    { 
     onState1: function() 
     { 
      // some code 
     }, 

     onState2: function() 
     { 
      // some code 
     } 
    }['on'+state]() 
} 

Какие цели имеют эти квадратные скобки после создания объекта functionOfState? Является ли это множеством возможных методов?

Извините, я новичок в JS, и я не нашел никакой информации об этом. Я очень ценю любую помощь.

+0

Такое интересное использование :) –

+0

Примечание: _ «Интересно» _ не обязательно означает «хорошо». – Cerbrus

ответ

0

Этот код делает почти же, как:

var functionOfState = 
{ 
    onState1: function() 
    { 
     // some code 
    }, 

    onState2: function() 
    { 
     // some code 
    } 
} 

functionOfState['on'+state](); 

Он просто создает объект, который хранит различные функции. Затем он вызывает один из них в соответствии с текущим значением state.

Может быть, это будет еще проще:

var functionOfState = {}; 

functionOfState['onState1'] = function() { 
    // someCode 
}; 

functionOfState['onState2'] = function() { 
    // someCode 
}; 

functionOfState['on'+state](); // when state is 'State2', 'onState2' will be called 

той разницей, что в вашем коде он не хранит этот объект с функциями, но называет это непосредственно.

+0

Вместо 'functionOfState ['onState1']', я бы использовал 'functionOfState.onState1' – Cerbrus

+0

Большое вам спасибо! Теперь я понимаю. Является ли это методом самозапускания, потому что он непосредственно называется? – escape

+0

@escape: Короче говоря, переменная 'functionOfState' будет содержать _ возвращенное значение_ от функции, выбранной с параметром' state'. Итак, если 'state === 'State1'', то' functionOfState' будет содержать любые 'onState1' _returns_. – Cerbrus

0

Это (не самый ясный) способ извлечь поле из объекта.
в JS, оператор подстрочный ([]) может извлечь свойство из объекта так же, как оператор точка (.), поэтому следующие выражения равны:

var obj = { field : value }; 
obj.field == obj["field"]; //returns true 

на вашем примере объект с полями onState1, onState2. то, используя индексный оператор, правильным свойством является extract. это равнозначно на письменной форме

prog.stateChange = function(state) 
{ 

    var temp = 
    { 
     onState1: function() 
     { 
      // some code 
     }, 

     onState2: function() 
     { 
      // some code 
     } 
    }; 
    var functionOfState = state == onState1 ? temp.onState1 : temp.onState2; 
    functionOfState(); 
} 

Это не законный способ извлечения свойства/метода из объекта. в основном, если кто-то изменяет имя метода, код прерывается. гораздо проще просто использовать корпус коммутатора.

+0

Указанный код не эквивалентен. Ваш код полностью игнорирует параметр 'state'. – Cerbrus

+0

Я считаю, что downvotes будут более эффективными. Это все еще не совсем эквивалентно: 'var functionOfState = temp ['on' + state]();' – Cerbrus

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