HTML: Markup language
CSS: Styling language
JavaScript: Scripting language
Web APIs: Programming interfaces
All web technology
Learn web development
Discover our tools
Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
View in English Always switch to English
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年9月.
メソッド定義は、オブジェクト初期化子内で関数プロパティを定義するための簡略化された構文です。また、クラス内でも使用できます。
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* のプロパティはすべて固有のメソッド構文があります。下記にある例を参照してください。
function*
async function
async function*
ただし、メソッド構文は、値として関数を持つ通常のプロパティとは同等ではないことに注意してください。意味論的に、違いがあります。これにより、オブジェクトリテラルで定義されたメソッドは、クラス内のメソッドとより一貫性を持つようになります。
メソッドはコンストラクターにはなれません。コンストラクターとしてインスタンス化しようとすると、 TypeError が発生します。 一方、関数として作成されたプロパティはコンストラクターとして使用できます。
TypeError
const obj = { method() {}, }; new obj.method(); // TypeError: obj.method is not a constructor
メソッドとして定義された関数のみが super キーワードにアクセスすることができます。 super.prop は、メソッドが初期化されたオブジェクトのプロトタイプ上でプロパティを検索します。
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 プロパティ上に定義されるため、そのクラスのすべてインスタンスで共有されます。これらは書き込み可能、列挙不可、構成不可です。
prototype
インスタンスメソッド内では、this と super は通常のメソッドと同様に動作します。通常、this はインスタンス自体を参照します。サブクラスでは、super を使用することで、メソッドが添付されたオブジェクトのプロトタイプにアクセスでき、スーパークラスのメソッドを呼び出すことができます。
this
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 およびプライベート要素のページで説明されています。
static
メソッド構文は算出プロパティ名にも対応しています。
const bar = { foo0: function () { return 0; }, foo1() { return 1; }, ["foo".toUpperCase()]() { return 2; }, }; console.log(bar.foo0()); // 0 console.log(bar.foo1()); // 1 console.log(bar.FOO()); // 2
ジェネレータープロパティ名の前にアスタリスク (*) が必要であることに注意してください。(すなわち、 * g(){} は動作しますが、 g *(){} は動作しません。)
*
* 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); // 0 console.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; }, };
Enable JavaScript to view this browser compatibility table.
get
set
class