Определения методов
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
Определение метода — это более короткий синтаксис для определения свойства функции в инициализаторе объекта. Его также можно использовать в классах.
Попробуйте
const obj = {
foo() {
return "bar";
},
};
console.log(obj.foo());
// Expected output: "bar"
Синтаксис
({
property(parameters) {},
*generator(parameters) {},
async property(parameters) {},
async *generator(parameters) {},
// with computed keys
[expression](parameters) {},
*[expression](parameters) {},
async [expression](parameters) {},
async *[expression](parameters) {},
})
Описание
Сокращенный синтаксис похож на синтаксис геттера и сеттера.
Учитывая следующий код:
const obj = {
foo: function () {
// …
},
bar: function () {
// …
},
};
Теперь вы можете сократить это до:
const obj = {
foo() {
// …
},
bar() {
// …
},
};
Свойства, определенные с использованием этого синтаксиса, являются собственными свойствами созданного объекта, и они являются настраиваемыми, перечисляемыми и записываемыми, как и обычные свойства.
function*, async function и async function* свойства имеют соответствующие синтаксисы методов; см. примеры ниже.
Однако обратите внимание, что синтаксис метода не эквивалентен обычному свойству со значением функции — существуют семантические различия. Это делает методы, определенные в литералах объектов, более согласованными с методами в классах.
Определения методов не могут быть конструкторами
Методы не могут быть конструкторами! Они вызовут TypeError, если вы попытаетесь их создать. С другой стороны, свойство, созданное как функция, может быть использовано как конструктор.
const obj = {
method() {},
};
new obj.method(); // TypeError: obj.method is not a constructor
Использование super в определениях методов
Только функции, определенные как методы, имеют доступ к ключевому слову 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 класса и поэтому разделяются всеми экземплярами класса. Они записываемые, неперечисляемые и настраиваемые.
Внутри методов экземпляра this и super работают так же, как и в обычных методах. Обычно this ссылается на сам экземпляр. В подклассах super позволяет получить доступ к прототипу объекта, к которому присоединен метод, что позволяет вызывать методы из суперкласса.
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 и приватные элементы.
Вычисляемые имена свойств
Синтаксис метода также поддерживает вычисляемые имена свойств.
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 *(){} — нет.)
// 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
Асинхронные методы
// Using a named property
const obj = {
f: async function () {
await somePromise;
},
};
// The same object using shorthand syntax
const obj2 = {
async f() {
await somePromise;
},
};
Асинхронные методы-генераторы
// 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;
},
};
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
method_definitions |
39 |
12 |
34 |
26 |
9 |
39 |
34 |
26 |
9 |
4.0 |
39 |
9 |
1.0.0 |
1.0 |
4.0.0 |
async_generator_methods |
63 |
79 |
57 |
50 |
12 |
63 |
57 |
46 |
12 |
8.0 |
63 |
12 |
1.0.0 |
1.0 |
10.0.0 |
async_methods |
55 |
15 |
52 |
42 |
10.1 |
55 |
52 |
42 |
10.3 |
6.0 |
55 |
10.3 |
1.0.0 |
1.0 |
7.6.0 |
generator_methods_not_constructable |
42 |
13 |
43 |
29 |
9.1 |
42 |
43 |
29 |
9.3 |
4.0 |
42 |
9.3 |
1.0.0 |
1.0 |
6.0.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions