このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
メソッド定義
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年9月.
メソッド定義は、オブジェクト初期化子内で関数プロパティを定義するための簡略化された構文です。また、クラス内でも使用できます。
In this article
試してみましょう
const obj = { foo() { return "bar"; },};console.log(obj.foo());// 予想される結果: "bar"構文
({ property(引数) {}, *generator(引数) {}, async property(引数) {}, async *generator(引数) {}, // 計算されたキー [式](引数) {}, *[式](引数) {}, async [式](引数) {}, async *[式](引数) {},})解説
以下のようなコードがあったとします。
const obj = { foo: function () { // … }, bar: function () { // … },};これを以下のように短縮することができます。
const obj = { foo() { // … }, bar() { // … },};この構文を使用して定義されたプロパティは、作成されたオブジェクトの自身のプロパティであり、通常のプロパティと同様に構成不可、列挙可能、書き込み可能です。
function*、async function、async function* のプロパティはすべて固有のメソッド構文があります。下記にある例を参照してください。
ただし、メソッド構文は、値として関数を持つ通常のプロパティとは同等ではないことに注意してください。意味論的に、違いがあります。これにより、オブジェクトリテラルで定義されたメソッドは、クラス内のメソッドとより一貫性を持つようになります。
メソッド定義は構築可能ではない
メソッドはコンストラクターにはなれません。コンストラクターとしてインスタンス化しようとすると、TypeError が発生します。 一方、関数として作成されたプロパティはコンストラクターとして使用できます。
const obj = { method() {},};new obj.method(); // TypeError: obj.method is not a constructorメソッド定義内での super の使用
メソッドとして定義された関数のみがsuper キーワードにアクセスすることができます。super.prop は、メソッドが初期化されたオブジェクトのプロトタイプ上でプロパティを検索します。
const obj = { __proto__: { prop: "foo", }, notAMethod: function () { console.log(super.prop); // SyntaxError: 'super' keyword unexpected here },};例
>メソッド定義の使用
const obj = { a: "foo", b() { return this.a; },};console.log(obj.b()); // "foo"クラス内でのメソッド定義
まったく同じ構文を使用して、クラスインスタンスで利用できるパブリックインスタンスメソッドを定義することができます。クラス内では、メソッド間を区切るカンマは必要ありません。
class ClassWithPublicInstanceMethod { publicMethod() { return "hello world"; } secondPublicMethod() { return "goodbye world"; }}const instance = new ClassWithPublicInstanceMethod();console.log(instance.publicMethod()); // "hello world"パブリックインスタンスメソッドはクラスのprototype プロパティ上に定義されるため、そのクラスのすべてインスタンスで共有されます。これらは書き込み可能、列挙不可、構成不可です。
インスタンスメソッド内では、this とsuper は通常のメソッドと同様に動作します。通常、this はインスタンス自体を参照します。サブクラスでは、super を使用することで、メソッドが添付されたオブジェクトのプロトタイプにアクセスでき、スーパークラスのメソッドを呼び出すことができます。
class BaseClass { msg = "hello world"; basePublicMethod() { return this.msg; }}class SubClass extends BaseClass { subPublicMethod() { return super.basePublicMethod(); }}const instance = new SubClass();console.log(instance.subPublicMethod()); // "hello world"静的メソッドとプライベートメソッドは似た構文を使用します。これらはstatic およびプライベート要素のページで説明されています。
算出プロパティ名
メソッド構文は算出プロパティ名にも対応しています。
const bar = { foo0: function () { return 0; }, foo1() { return 1; }, ["foo".toUpperCase()]() { return 2; },};console.log(bar.foo0()); // 0console.log(bar.foo1()); // 1console.log(bar.FOO()); // 2ジェネレーターメソッド
ジェネレータープロパティ名の前にアスタリスク (*) が必要であることに注意してください。(すなわち、* g(){} は動作しますが、g *(){} は動作しません。)
// 名前付きプロパティを使用const obj = { 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); // 0console.log(it.next().value); // 1非同期メソッド
// 名前付きプロパティconst obj = { f: async function () { await somePromise; },};// 簡略構文を使用して同じオブジェクトを生成const obj2 = { async f() { await somePromise; },};非同期ジェネレーターメソッド
// 名前付きプロパティの使用const obj = { f: async function* () { yield 1; yield 2; yield 3; },};// 簡略構文を使用して同じオブジェクトを生成const obj2 = { async *f() { yield 1; yield 2; yield 3; },};仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-method-definitions> |