03 April 2013

原文:ECMAScript 6 and Object Literal Property Value Shorthand

对于每个 JavaScript 开发人员,使用字面量语法构造一个对象是非常熟悉的做法,这很可能是因为这种做法让人想起 JSON。而每个对象属性必须是一对 key-value 或 getter/setter,这可能会在不久的将来改变。即将到来的 ECMAScript 6 的另一个语法糖是对象字面属性值简写

考虑下面的 ECMAScript 5 代码片段:

function createMonster(name, power) {
  return { type: 'Monster', name: name, power: power };
}
function createWitch(name) {
  return { type: 'Witch', name: name };
}

使用新的简写形式后,这段代码可以被改写为下面的代码:

function createMonster(name, power) {
  return { type: 'Monster', name, power };
}
function createWitch(name) {
  return { type: 'Witch', name };
}

正如你看到的,这段代码可以工作是因为属性值与属性标识符同名。这是最新的 ECMAScript 6 草案 Rev 13对象初始化语法(11.1.5 节)新的补充。当然,就像 ECMAScript 3 的限制集合,你不能使用保留字作为属性名。

在现在世界的代码中使用这种简写符号会怎么样?在 Backbone.js 的某个地方,我们可以使用下面的形式,代替它更长(旧)的形式:

route: function(route, callback) {
  this.handlers.unshift({route, callback});
},

为了提高可读性,很多时候,我们在用属性构造对象之前会使用临时变量。再举一个例子,QUnit 的某块代码可以使用下面的简化语法:

test = new Test({nameHtml, testName, expected, async,
  callback,module: config.currentModule,
  moduleTestEnvironment: config.currentModuleTestEnvironment,
  stack: sourceFromStacktrace(2)
});

这种简写不会显著的改变你的代码,它仅仅是让事情变得有点“甜蜜”(sweeter)。

附录

虽然字面量简写本身就是有用的,但在许多情况下,更频繁遇到的是它与对象模式(见我以前关于 ECMAScript 6 解构 的帖子)结合使用。因此,下面的的代码片段:

books.forEach(function ({title: title, author: author}) {
  console.log(title, 'is written by', author);
});

变成这样:

books.forEach(function ({title, author}) {
  console.log(title, 'is written by', author);
});

正如你看到的,这样的对称性(属性值与属性标识符同名)非常适合这种情况。



blog comments powered by Disqus