--- title: Method definitions slug: Web/JavaScript/Reference/Functions/Method_definitions tags: - ECMAScript 2015 - JavaScript - Об'єкт - Синтаксис - Скорочення - функції translation_of: Web/JavaScript/Reference/Functions/Method_definitions ---
Починаючи з ECMAScript 2015, з'явився скорочений спосіб визначення методів для обєктів. Який допоможе вам простіше привязати функцію до імя методу обєкта.
var obj = { property( parameters… ) {}, *generator( parameters… ) {}, async property( parameters… ) {}, async* generator( parameters… ) {}, // з обчисленими ключами: [property]( parameters… ) {}, *[generator]( parameters… ) {}, async [property]( parameters… ) {}, // порівняйте getter/setter синтаксис: get property() {}, set property(value) {} };
Скорочений синтаксис подібний до синтаксису getter і setter оголошенних в ECMAScript 2015.
Отже, цей код:
var obj = { foo: function() { /* код */ }, bar: function() { /* код */ } };
Ви здатні скоротити до:
var obj = { foo() { /* код */ }, bar() { /* код */ } };
Генераторні методи також можуть бути визначенні за допомогою скороченного синтаксису. Користуючить ними:
* g(){}
- це працюватиме, g *(){}
- це ні.yield
. Це означає, що застарілі генераторні функції також не працюватимуть і викинуть {{jsxref("SyntaxError")}}. Завжди використовуйте yield
разом із зірочкою (*).// Використовуючи названу властивіть 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
{{jsxref("Statements/async_function", "Async methods", "", 1)}} також можуть бути визначенні використовуючи скорочення.
// Використовуючи названу властивіть var obj3 = { f: async function () { await some_promise; } }; // Ідентичний обєкт використовуючи скорочений синтаксис var obj3 = { async f() { await some_promise; } };
Генераторні методи також можуть бути {{jsxref("Statements/async_function", "async", "", 1)}}.
var obj4 = { f: async function* () { yield 1; yield 2; yield 3; } }; // Ідентичний обєкт використовуючи скорочений синтаксис var obj4 = { async* f() { yield 1; yield 2; yield 3; } };
Любі визначенні методи за допомогою скорочення не є конструктором і викинуть {{jsxref("TypeError")}}, якщо ви попробуєте створити екземпляр обєкту за допомогою них.
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)
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
Specification | Status | Comment |
---|---|---|
{{SpecName('ES2015', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ES2015')}} | Initial definition. |
{{SpecName('ES2016', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ES2016')}} | Changed that generator methods should also not have a [[Construct]] trap and will throw when used with new . |
{{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.functions.method_definitions")}}