03 April 2013

原文:ECMAScript 6 and Method Definitions

在任何严肃的 JavaScript 应用程序中,使用含有一些成员函数的对象字面量是一种常见的做法。这种做法对所有类型的框架也是非常有用的,特别是建立对象原型。即将到来的 ECMAScript 6 引入了方法定义,一种非常好的简写方式,使用这种模式可以消除对 function 的需要。

在查看方法定义之前,我们先快速回顾一下属性 setter 和 getter。这是当前 ECMAScript 5.1 的一部分,请参见 11.1.5 节 的对象初始化。总的思想是使用 setget 将一个对象属性绑定到一个函数,当时属性被设置或读取时函数被调用。下面的代码片段演示了这种用法:

var BigLoco = {
  locoName: 'Gordon',
  get name() { return this.locoName; },
  set name(n) { this.locoName = n }
};

console.log(BigLoco.name); // 'Gordon'

实际上,我们有办法定义一个函数而不使用关键字 function 。在 ECMAScript 6 中,这种语法被进一步扩展,不只适用于属性的 getter 和 setter,也适用于普通函数。这种语法被称为方法定义,请参见最新的 ES6 草案13.3 节

看一看这里的 ECMAScript 6 代码示例,特别是 startstop 函数。

var SteamEngine = {
  color: 'blue',
  get name() { return 'Thomas' },
  start() { console.log('Hurry up!'); },
  stop() { console.log('Screech...! That was close.'); }
};

console.log('My name is', SteamEngine.name);
SteamEngine.start();
SteamEngine.stop();

如果我们想要把这段代码转换为 ES5,结构会看起来像这样:

var SteamEngine = {
  color: 'blue',
  get name() { return 'Thomas' },
  start: function() { console.log('Hurry up!'); },
  stop: function() { console.log('Screech...! That was close.'); }
};

ECMAScript 6 对于这一语法糖显示出了良好的对称性。对象字面量中的每个属性看起来一样,并且由于必要的括号不难识别出其中的函数。



blog comments powered by Disqus