aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/reference/functions/method_definitions/index.html
blob: 04b66d802a1e1643ed8a3c1e0f406c5d3854f9f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
---
title: メソッド定義
slug: Web/JavaScript/Reference/Functions/Method_definitions
tags:
  - ECMAScript 2015
  - ECMAScript6
  - Functions
  - JavaScript
  - Object
  - Syntax
translation_of: Web/JavaScript/Reference/Functions/Method_definitions
---
<div>{{JsSidebar("Functions")}}</div>

<p>ECMAScript 2015 より、オブジェクトイニシャライザのメソッド定義のための短い構文が導入されました。これは、メソッドの名前に割り当てられた関数の省略形です。</p>

<div>{{EmbedInteractiveExample("pages/js/functions-definitions.html")}}</div>



<h2 id="Syntax" name="Syntax">構文</h2>

<pre class="syntaxbox">const obj = {
  get <var>property</var>() {},
  set <var>property</var>(<var>value</var>) {},
  <var>property</var>( <var>parameters…</var> ) {},
  *<var>generator</var>( <var>parameters…</var> ) {},
  async <var>property</var>( <var>parameters…</var> ) {},
  async* <var>generator</var>( <var>parameters…</var> ) {},

  // 算出されたキーも使用可能:
  get [<var>property]</var>() {},
  set [<var>property]</var>(<var>value</var>) {},
  [<var>property</var>]( <var>parameters…</var> ) {},
  *[<var>generator</var>]( <var>parameters…</var> ) {},
  async [<var>property</var>]( <var>parameters…</var> ) {},
  async* [<var>generator]</var>( <var>parameters…</var> ) {},
};
</pre>

<h2 id="Description" name="Description">説明</h2>

<p>簡略構文は、ECMAScript 第 5 版で導入された <a href="/ja/docs/Web/JavaScript/Reference/Functions/get">getter</a><a href="/ja/docs/Web/JavaScript/Reference/Functions/set">setter</a> 構文に似ています。</p>

<p>次のコードを例にすると:</p>

<pre class="brush: js">var obj = {
  foo: function() {
    /* コード */
  },
  bar: function() {
    /* コード */
  }
};
</pre>

<p>これを以下のように短縮することができます:</p>

<pre class="brush: js">var obj = {
  foo() {
    /* コード */
  },
  bar() {
    /* コード */
  }
};

</pre>

<h3 id="Generator_methods" name="Generator_methods">短縮形ジェネレーターメソッド</h3>

<p><a href="/ja/docs/Web/JavaScript/Reference/Statements/function*">Generator メソッド</a>は同様に簡略構文を使用して定義することができます。</p>

<p>簡略構文では:</p>

<ul>
 <li>ジェネレータープロパティ名の前にアスタリスク (*)が 必要です。すなわち、<code>* g(){}</code> は動作しますが、<code>g *(){}</code> は動作しません。</li>
 <li>非ジェネレーターメソッド定義では <code>yield</code> キーワードを入れることはできません。つまり <a href="/ja/docs/Web/JavaScript/Reference/Statements/Legacy_generator_function">旧式の ジェネレーター関数</a> は動作せず、{{jsxref("SyntaxError")}}を投げます。<code>yield</code> は常にアスタリスク (<code>*</code>)と一緒に使ってください。</li>
</ul>

<pre class="brush: js;highlight[12]">// 名前付きプロパティを使用 (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</pre>

<h3 id="Async_methods" name="Async_methods">Async メソッド</h3>

<p>{{jsxref("Statements/async_function", "Async メソッド", "", 1)}}も簡略構文を使用して定義することができます。</p>

<pre class="brush: js;highlight[12]">// 名前付きプロパティ
const obj3 = {
  f: async function () {
    await some_promise
  }
};

// 簡略構文を使用して同じオブジェクトを生成
const obj3 = {
  async f() {
    await some_promise
  }
};
</pre>

<h3 id="Async_generator_methods" name="Async_generator_methods">Async ジェネレーターメソッド</h3>

<p><a href="/ja/docs/Web/JavaScript/Reference/Statements/function*">Generator メソッド</a>{{jsxref("Statements/async_function", "async", "", 1)}} 関数にすることができます。</p>

<pre class="brush: js">const obj4 = {
  f: async function* () {
    yield 1
    yield 2
    yield 3
  }
};

// 簡略構文を使用して同じオブジェクトを生成
const obj4 = {
  async* f() {
   yield 1
   yield 2
   yield 3
  }
};</pre>

<h3 id="Method_definitions_are_not_constructable" name="Method_definitions_are_not_constructable">メソッド定義はコンストラクタブルではない</h3>

<p>すべてのメソッド定義がコンストラクターではない(簡略構文のみ!)ため、インスタンス化しようとすると {{jsxref("TypeError")}} が発生します。</p>

<pre class="brush: js example-bad">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 で変更)
</pre>

<h2 id="Examples" name="Examples"></h2>

<h3 id="Simple_test_case" name="Simple_test_case">簡単なテストケース</h3>

<pre class="brush: js;highlight[3]">const obj = {
  a: 'foo',
  b() { return this.a }
};
console.log(obj.b()) // "foo"
</pre>

<h3 id="Computed_property_names" name="Computed_property_names">計算されたプロパティ名</h3>

<p>簡略構文は計算されたプロパティ名もサポートします。</p>

<pre class="brush: js;highlight[4]">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</pre>

<h2 id="Specifications" name="Specifications">仕様</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">仕様書</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}}</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザー実装状況</h2>



<p>{{Compat("javascript.functions.method_definitions")}}</p>

<h2 id="See_also" name="See_also">関連情報</h2>

<ul>
 <li><code><a href="/ja/docs/Web/JavaScript/Reference/Functions/get">get</a></code></li>
 <li><code><a href="/ja/docs/Web/JavaScript/Reference/Functions/set">set</a></code></li>
 <li><a href="/ja/docs/Web/JavaScript/Reference/Lexical_grammar">字句文法</a></li>
</ul>