【问题标题】:How a javascript object can have only property without predefined keyjavascript 对象如何只能具有没有预定义键的属性
【发布时间】:2017-01-19 10:54:28
【问题描述】:

我有一些“愚蠢”的问题,抱歉,但我真的不明白它是如何工作的。

在这个 createReducer 调用中,我们传递了第二个参数 - js 对象(据我所知)。

但我没有看到任何键……只有功能。它是如何工作的?

  export const todos = createReducer([], {
      [ActionTypes.ADD_TODO](state, action) {
        let text = action.text.trim()
        return [ ...state, text ]
      }
    })


function createReducer(initialState, handlers) {
  return function reducer(state = initialState, action) {
    if (handlers.hasOwnProperty(action.type)) {
      return handlers[action.type](state, action)
    } else {
      return state
    }
  }
}

我预计会看到类似的内容:

    {
          [ActionTypes.ADD_TODO] : (state, action) => {
                let text = action.text.trim()
                return [ ...state, text ]
              }
        }

这个结构也一样:它是一个函数,关键在哪里?怎么可能?

const dynamicRoutes = {
    component : AppComponent,
    childRoutes : [
        {
            path : "/",
            getComponent(location, cb) {
                System.import("../modules/landing-page/LandingPage.module")
                    .then(loadRoute(cb))
                    .catch(errorLoading);
            }
        }

    ]
};

感谢您的帮助!

【问题讨论】:

标签: javascript ecmascript-6


【解决方案1】:

它是方法的简写符号。关键是函数的名称。所以[ActionTypes.ADD_TODO](state, action) { 等价于[ActionTypes.ADD_TODO]: function(state, action) {

【讨论】:

    【解决方案2】:

    这些是有效的object initializer 语法。 第二个例子是MethodDefinition(link to spec)的简单案例

    [ActionTypes.ADD_TODO](state, action) 也是MethodDefinition,但方法/属性名称定义为ComputedPropertyName,其语法为[ AssignmentExpression[In, ?Yield] ]。 在ComputedPropertyNames 的情况下,可以将变量/对象属性放在方括号之间,该值将用作新创建对象中的属性名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2020-01-15
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多