Methodendefinitionen

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.

Methodendefinition ist eine kürzere Syntax zum Definieren einer Funktions-Eigenschaft in einem Objektinitialisierer. Sie kann auch in Klassen verwendet werden.

Probieren Sie es aus

Syntax

js
({
  property(parameters) {},
  *generator(parameters) {},
  async property(parameters) {},
  async *generator(parameters) {},

  // with computed keys
  [expression](parameters) {},
  *[expression](parameters) {},
  async [expression](parameters) {},
  async *[expression](parameters) {},
})

Beschreibung

Die Kurzsyntax ist ähnlich wie die Syntax für getter und setter.

Angenommen, folgendes ist der Code:

js
const obj = {
  foo: function () {
    // …
  },
  bar: function () {
    // …
  },
};

Diesen können Sie nun verkürzen zu:

js
const obj = {
  foo() {
    // …
  },
  bar() {
    // …
  },
};

Eigenschaften, die mit dieser Syntax definiert werden, sind Eigen-Eigenschaften des erstellten Objekts und sie sind konfigurierbar, aufzählbar und beschreibbar, genau wie normale Eigenschaften.

function*, async function und async function* Eigenschaften besitzen alle ihre jeweiligen Methodensyntaxen; siehe Beispiele unten.

Beachten Sie jedoch, dass die Methodensyntax nicht äquivalent zu einer normalen Eigenschaft mit einer Funktion als Wert ist — es gibt semantische Unterschiede. Dies macht Methoden, die in Objektliteralen definiert sind, konsistenter mit Methoden in Klassen.

Methodendefinitionen sind nicht konstruierbar

Methoden können keine Konstruktoren sein! Sie werfen einen TypeError, wenn Sie versuchen, sie zu instanziieren. Andererseits kann eine als Funktion erstellte Eigenschaft als Konstruktor verwendet werden.

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

Verwendung von super in Methodendefinitionen

Nur Funktionen, die als Methoden definiert sind, haben Zugriff auf das super Schlüsselwort. super.prop sucht die Eigenschaft im Prototyp des Objekts, auf dem die Methode initialisiert wurde.

js
const obj = {
  __proto__: {
    prop: "foo",
  },
  notAMethod: function () {
    console.log(super.prop); // SyntaxError: 'super' keyword unexpected here
  },
};

Beispiele

Verwendung von Methodendefinitionen

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

Methodendefinitionen in Klassen

Sie können exakt die gleiche Syntax nutzen, um öffentliche Instanzmethoden zu definieren, die auf Klasseninstanzen verfügbar sind. In Klassen benötigen Sie nicht das Kommatrennzeichen zwischen den Methoden.

js
class ClassWithPublicInstanceMethod {
  publicMethod() {
    return "hello world";
  }
  secondPublicMethod() {
    return "goodbye world";
  }
}

const instance = new ClassWithPublicInstanceMethod();
console.log(instance.publicMethod()); // "hello world"

Öffentliche Instanzmethoden werden auf der prototype Eigenschaft der Klasse definiert und sind somit von allen Instanzen der Klasse geteilt. Sie sind beschreibbar, nicht aufzählbar und konfigurierbar.

Innerhalb von Instanzmethoden funktionieren this und super wie in normalen Methoden. In der Regel bezieht sich this auf die Instanz selbst. In Unterklassen ermöglicht super, auf den Prototyp des Objekts zuzugreifen, an dem die Methode angehängt ist, was es ermöglicht, Methoden der Superklasse aufzurufen.

js
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"

Statische Methoden und private Methoden verwenden ähnliche Syntaxen, die auf den Seiten zu static und privaten Eigenschaften beschrieben sind.

Berechnete Eigenschaftsnamen

Die Methodensyntax unterstützt auch berechnete Eigenschaftsnamen.

js
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

Generator-Methoden

Beachten Sie, dass das Sternchen (*) in der Generatormethoden-Syntax vor dem Generator-Eigenschaftsnamen stehen muss. (Das heißt, * g(){} funktioniert, aber g *(){} nicht.)

js
// Using a named property
const obj = {
  g: function* () {
    let index = 0;
    while (true) {
      yield index++;
    }
  },
};

// The same object using shorthand syntax
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

Async-Methoden

js
// Using a named property
const obj = {
  f: async function () {
    await somePromise;
  },
};

// The same object using shorthand syntax
const obj2 = {
  async f() {
    await somePromise;
  },
};

Async-Generator-Methoden

js
// Using a named property
const obj = {
  f: async function* () {
    yield 1;
    yield 2;
    yield 3;
  },
};

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

Spezifikationen

Specification
ECMAScript Language Specification
# sec-method-definitions

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch