Beginnend mit ECMAScript 2015 (ES6) wurde eine kürzere Syntax für Methodendefinitionen in Objekt Initialisierungen eingeführt. Es ist eine Abkürzung für die Zuweisung einer Funktion an einen Methodennamen.
Syntax
var obj = { property( parameters… ) {}, *generator( parameters… ) {}, // also with computed keys: [property]( parameters… ) {}, *[generator]( parameters… ) {}, // compare ES5 getter/setter syntax: get property() {}, set property(value) {} };
Beschreibung
Die Syntax der Kurzschreibweise ähnelt der in ECMAScript 2015 eingeführten Syntax der getter und setter.
Gegeben sei der folgende Quellcode:
var obj = { foo: function() {}, bar: function() {} };
Jetzt können Sie das abkürzen zu:
var obj = { foo() {}, bar() {} };
Hinweis: Die kurze Syntax benutzt benamte Funktionen statt anonymen Funktionen (wie in ...foo: function() {}
...). Benamte Funktionen können sich vom Funktionskörper aus aufrufen (für anonyme Funktionen ist das unmöglich, weil sie keinen Bezeichner haben). Für mehr Details, siehe function
.
Kurze Generatormethoden
Generatormethoden können mit der kurzen Syntax ebenfalls definiert werden. Zu beachten ist, dass der Stern (*) in der kurzen Syntax nur vor dem Namen der Generatoreigenschaft geschrieben werden kann. * g(){}
funktioniert, g *(){}
funktioniert nicht.
// Using a named property (pre-ES6) var obj2 = { g: function*() { var index = 0; while(true) yield index++; } }; // The same object using shorthand syntax var obj2 = { * g() { var index = 0; while(true) yield index++; } }; var it = obj2.g(); console.log(it.next().value); // 0 console.log(it.next().value); // 1
Methodendefinitionen die nicht konstruiert werden können
Alle Methodendefinitionen die keine Konstruktoren sind werden einen TypeError
erzeugen, wenn man versucht sie zu instantieren.
var obj = { method() {}, }; new obj.method; // TypeError: obj.method is not a constructor var obj = { * g() {} }; new obj.g; // TypeError: obj.g is not a constructor (changed in ES2016)
Beispiele
Ein einfacher Testfall
var obj = { a : "foo", b(){ return this.a; } }; console.log(obj.b()); // "foo"
Berechnete Eigenschaftsnamen
Die Kurzschreib-Syntax unterstützt auch berechnete Eigenschaftsnamen.
var 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
Spezifikationen
Spezifikation | Status | Kommentar |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'Method definitions' in dieser Spezifikation. |
Standard | Initiale Definition. |
ECMAScript 2016 (ECMA-262) Die Definition von 'Method definitions' in dieser Spezifikation. |
Standard | Geändert, dass Generatormethoden ebenfalls nicht initialisierbar sind und einen Fehler schmeißen, wenn sie mit new eingesetzt werden. |
ECMAScript 2017 Draft (ECMA-262) Die Definition von 'Method definitions' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Method definition shorthand | 39 | 34 (34) | Nicht unterstützt | 26 | Nicht unterstützt |
Generator methods are not constructable (ES2016) | ? | 43 (43) | ? | ? | ? |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Method definition shorthand | Nicht unterstützt | Nicht unterstützt | 34.0 (34) | Nicht unterstützt | Nicht unterstützt | Nicht unterstützt |
Generator methods are not constructable (ES2016) | ? | ? | 43.0 (43) | ? | ? | ? |
SpiderMonkey spezifische Hinweise
- Vor SpiderMonkey 38 (Firefox 38 / Thunderbird 38 / SeaMonkey 2.35) waren "
get
" und "set
" nicht valide Namen für Generatormethoden. Das wurde in Bug 1073809 behoben. - Vor SpiderMonkey 41 (Firefox 41 / Thunderbird 41 / SeaMonkey 2.38) mussten geschweifte Klammern für Methoden nicht notwendiger weise benutzt werden. Jetzt sind sie vorausgesetzt, um konform zur ES6 Spezifikation zu sein. Es wird ein
SyntaxError
in dieser und späteren Versionen erzeugt (Bug 1150855).var o = {x() 12}; // SyntaxError
- Die Restriktion, dass Generatormethoden Konstuktoren sind wurde in SpiderMonkey 41 (Firefox 41 / Thunderbird 41 / SeaMonkey 2.38) implementiert. Dazu siehe auch Bug 1059908 und Bug 1166950