为什么对象定义不需要函数关键字?

时间:2016-01-08 18:31:43

标签: javascript

当使用纯javascript时,我注意到有些人会将他们的对象编码为这样定义:

var oddObject = {
    someProperty: 'random1',

  // NOTE: No function keyword. Why does this work and are there
  //       other places this is also not required?
  someFunction() { return "boring value"; },
  someOtherProperty: 'random2'
}

var el = document.getElementById("result");
el.innerHTML = oddObject.someFunction();

如果你真的想看到它does work(至少从Chrome 47开始),我做了一个小提琴。那么为什么这是允许的,还有其他地方我可以利用缩写吗?

1 个答案:

答案 0 :(得分:2)

这是在ES2015中添加的。在ES2015 Object Initializer syntax中,我们看到对象文字中的 PropertyDefinition 可以是以下之一:

  

PropertyDefinition

     
      
  • IdentifierReference
  •   
  • CoverInitializedName
  •   
  • PropertyName AssignmentExpression
  •   
  • MethodDefinition
  •   

MethodDefinition是以下之一:

  

MethodDefinition

     
      
  • PropertyName StrictFormalParameters ){ FunctionBody }
  •   
  • GeneratorMethod
  •   
  • 获取 PropertyName (){ FunctionBody }
  •   
  • 设置 PropertyName PropertySetParameterList ){ FunctionBody }
  •   

相比之下,previous ES5 spec's Object Intializer仅允许普通的名称/值对和set / get函数:

  

PropertyAssignment

     
      
  • PropertyName AssignmentExpression
  •   
  • 获取 PropertyName (){ FunctionBody }
  •   
  • 设置 PropertyName PropertySetParameterList ){ FunctionBody }
  •   

由于ES2015最近才最终确定,因此可能尚未广泛实施。 (kangax.github.io上有一个兼容性表格。)

请注意,ES2015语法还将 IdentifierReference 添加为有效属性,允许您通过在对象文字中包含其名称来在对象中包含变量值:

var foo = "bar";
var obj = {
    baz: 3,
    foo
};

此独立foo属性与属性定义foo: "bar"的作用相同。