--- title: メソッド定義 slug: Web/JavaScript/Reference/Functions/Method_definitions tags: - ECMAScript 2015 - ECMAScript6 - Functions - JavaScript - Object - Syntax translation_of: Web/JavaScript/Reference/Functions/Method_definitions ---
ECMAScript 2015 より、オブジェクトイニシャライザのメソッド定義のための短い構文が導入されました。これは、メソッドの名前に割り当てられた関数の省略形です。
const obj = { get property() {}, set property(value) {}, property( parameters… ) {}, *generator( parameters… ) {}, async property( parameters… ) {}, async* generator( parameters… ) {}, // 算出されたキーも使用可能: get [property]() {}, set [property](value) {}, [property]( parameters… ) {}, *[generator]( parameters… ) {}, async [property]( parameters… ) {}, async* [generator]( parameters… ) {}, };
簡略構文は、ECMAScript 第 5 版で導入された getter や setter 構文に似ています。
次のコードを例にすると:
var obj = { foo: function() { /* コード */ }, bar: function() { /* コード */ } };
これを以下のように短縮することができます:
var obj = { foo() { /* コード */ }, bar() { /* コード */ } };
Generator メソッドは同様に簡略構文を使用して定義することができます。
簡略構文では:
* g(){}
は動作しますが、g *(){}
は動作しません。yield
キーワードを入れることはできません。つまり 旧式の ジェネレーター関数 は動作せず、{{jsxref("SyntaxError")}}を投げます。yield
は常にアスタリスク (*
)と一緒に使ってください。// 名前付きプロパティを使用 (ES6 より前) const obj2 = { g: function*() { let index = 0 while(true) yield index++ } }; // 簡略構文を使用して同じオブジェクトを生成 const obj2 = { * g() { let index = 0; while(true) yield index++ } }; const it = obj2.g() console.log(it.next().value) // 0 console.log(it.next().value) // 1
{{jsxref("Statements/async_function", "Async メソッド", "", 1)}}も簡略構文を使用して定義することができます。
// 名前付きプロパティ const obj3 = { f: async function () { await some_promise } }; // 簡略構文を使用して同じオブジェクトを生成 const obj3 = { async f() { await some_promise } };
Generator メソッドも {{jsxref("Statements/async_function", "async", "", 1)}} 関数にすることができます。
const obj4 = { f: async function* () { yield 1 yield 2 yield 3 } }; // 簡略構文を使用して同じオブジェクトを生成 const obj4 = { async* f() { yield 1 yield 2 yield 3 } };
すべてのメソッド定義がコンストラクターではない(簡略構文のみ!)ため、インスタンス化しようとすると {{jsxref("TypeError")}} が発生します。
const obj = { method() {}, }; new obj.method // TypeError: obj.method is not a constructor const obj = { * g() {} }; new obj.g; // TypeError: obj.g is not a constructor (ES2016 で変更)
const obj = { a: 'foo', b() { return this.a } }; console.log(obj.b()) // "foo"
簡略構文は計算されたプロパティ名もサポートします。
const 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 // A global function function foo() { return 1 } let name = 'foo' console.log(window[name]()) // 1
仕様書 |
---|
{{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}} |
{{Compat("javascript.functions.method_definitions")}}