方法定義

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

自 ECMAScript 2015 開始,引入了一種於物件初始器(objects initializers)中定義方法的簡短語法。是一個將函式指派予方法名稱的簡便方式。

嘗試一下

語法

var obj = {
  property( parameters… ) {},
  *generator( parameters… ) {},
  async property( parameters… ) {},
  async* generator( parameters… ) {},

  // with computed keys:
  [property]( parameters… ) {},
  *[generator]( parameters… ) {},
  async [property]( parameters… ) {},

  // compare getter/setter syntax:
  get property() {},
  set property(value) {}
};

說明

這個簡短的語法和在 ECMAScript 2015 引入 getter 以及 setter 類似。

請看以下程式碼:

js
var obj = {
  foo: function () {
    /* code */
  },
  bar: function () {
    /* code */
  },
};

你可以把它縮減為:

js
var obj = {
  foo() {
    /* code */
  },
  bar() {
    /* code */
  },
};

產生器方法

產生器方法(Generator method)也可以透過簡短語法定義之。用的時候:

  • 簡短語法的星號(*)必須放在產生器方法的屬性名前面。也就是說 * g(){} 能動但 g *(){} 不行;
  • 非產生器方法的定義可能不會有 yield 關鍵字。也就是說過往的產生器函式動不了、並拋出SyntaxError。Always use yield in conjunction with the asterisk (*).
js
// Using a named property
var obj2 = {
  g: function* () {
    var index = 0;
    while (true) yield index++;
  },
};

// The same object using shorthand syntax
var obj2 = {
  *g() {
    var index = 0;
    while (true) yield index++;
  },
};

var it = obj2.g();
console.log(it.next().value); // 0
console.log(it.next().value); // 1

Async 方法

Async 方法 也可以透過簡短語法定義。

js
// Using a named property
var obj3 = {
  f: async function () {
    await some_promise;
  },
};

// The same object using shorthand syntax
var obj3 = {
  async f() {
    await some_promise;
  },
};

Async generator methods

Generator methods can also be async.

js
var obj4 = {
  f: async function* () {
    yield 1;
    yield 2;
    yield 3;
  },
};

// The same object using shorthand syntax
var obj4 = {
  async *f() {
    yield 1;
    yield 2;
    yield 3;
  },
};

Method definitions are not constructable

All method definitions are not constructors and will throw a TypeError if you try to instantiate them.

js
var obj = {
  method() {},
};
new obj.method(); // TypeError: obj.method is not a constructor

var obj = {
  *g() {},
};
new obj.g(); // TypeError: obj.g is not a constructor (changed in ES2016)

範例

Simple test case

js
var obj = {
  a: "foo",
  b() {
    return this.a;
  },
};
console.log(obj.b()); // "foo"

Computed property names

The shorthand syntax also supports computed property names.

js
var bar = {
  foo0: function () {
    return 0;
  },
  foo1() {
    return 1;
  },
  ["foo" + 2]() {
    return 2;
  },
};

console.log(bar.foo0()); // 0
console.log(bar.foo1()); // 1
console.log(bar.foo2()); // 2

規範

Specification
ECMAScript Language Specification
# sec-method-definitions

瀏覽器相容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
Method definitions
Async generator methods
Async methods
Generator methods are not constructable (ES2016)

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

參見