This translation is incomplete. Please help translate this article from English.
Это экспериментальная технология, часть предложения Harmony (ECMAScript 6).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.
Начиная с ECMAScript 6, существует короткий синтаксис для определения методов в инициализаторе объекта. По сути, это сокращение для функции, которая назначена имени метода.
Синтаксис
var obj = {
property([parameters]) {},
get property() {},
set property(value) {},
* generator() {}
};
Описание
Короткий синтаксис похожий на синтаксис getter'ов и setter'ов представленых в ECMAScript 5.
Данный следующий код:
var obj = {
foo: function() {},
bar: function() {}
};
Вы теперь можете сократить до:
var obj = {
foo() {},
bar() {}
};
Сокращение методов-генераторов
Методы-генераторы также могут быть определены используя короткий синтаксис. Обратите внимание, что звездочка (*) в коротком синтаксисе должна быть перед именем свойства генератора. То есть, * g(){} будет работать, а g *(){} не будет.
// Используя свойство с именем (pre-ES6)
var obj2 = {
g: function*() {
var index = 0;
while(true)
yield index++;
}
};
// Тот же объект используя короткий синтаксис
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
Определения методов (ES6) не могут быть конструкторами
Все определения методов кроме методов-генераторов не могут быть конструкторами и будут выбрасывать TypeError если вы попытаетесь создать их экземпляр.
var obj = {
method() {},
};
new obj.method; // TypeError: obj.method is not a constructor
var obj = {
* g() {}
};
new obj.g; // Генератор
Примеры
Простой тестовый пример
var obj = {
a : "foo",
b(){ return this.a; }
};
console.log(obj.b()); // "foo"
Вычисляемые имена свойств
Короткий синтаксис также поддерживает вычисляемые имена свойств.
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
Спецификации
| Спецификация | Статус | Комментарий |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Method definitions' в этой спецификации. |
Стандарт | Изначальное определение. |
Совместимость с браузерами
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Method definition shorthand | 39 | 34 (34) | Нет | 26 | Нет |
| Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Method definition shorthand | Нет | Нет | 34.0 (34) | Нет | Нет | Нет |
SpiderMonkey-specific notes
- Prior to SpiderMonkey 38 (Firefox 38 / Thunderbird 38 / SeaMonkey 2.35), "
get" and "set" were invalid names for generator methods. This has been fixed in ошибка 1073809. - Prior to SpiderMonkey 41 (Firefox 41 / Thunderbird 41 / SeaMonkey 2.38), curly braces were not required in method definitions. They are required from now on to conform to the ES6 specification and will throw a
SyntaxErrorin this and later versions (ошибка 1150855).var o = {x() 12}; // SyntaxError - The restriction that only generator methods are constructors has been implemented in SpiderMonkey 41 (Firefox 41 / Thunderbird 41 / SeaMonkey 2.38). See also ошибка 1059908 and ошибка 1166950.