--- title: Definições de Método slug: Web/JavaScript/Reference/Functions/Method_definitions tags: - ECMAScript 2015 - Funções - JavaScript - Objeto - Sintaxe translation_of: Web/JavaScript/Reference/Functions/Method_definitions original_slug: Web/JavaScript/Reference/Functions/Definicoes_metodos ---
No ECMAScript 2015 foi introduzida uma sintaxe reduzida para definição de métodos em inicializadores de objetos. É uma abreviação para uma função atribuída ao nome do método.
{{EmbedInteractiveExample("pages/js/functions-definitions.html")}}
O código desse exemplo interativo está salvo em um repositório do GitHub. Se você quiser contribuir com o projeto de exemplos interativos, clone https://github.com/mdn/interactive-examples e envie-nos um pull request.
var obj = {
propriedade( parametros… ) {},
*generator( parametros… ) {},
// também com chaves computadas:
[propriedade]( parameters… ) {},
*[generator]( parametros… ) {},
// compare ES5 sintaxe para getter/setter:
get propriedade() {},
set propriedade(valor) {}
};
A sintaxe reduzida é similar à da getter e setter introduzida no ECMAScript 5.
Dado o seguinte código:
var obj = {
foo: function() {},
bar: function() {}
};
Agora você pode reduzi-lo para isto:
var obj = {
foo() {},
bar() {}
};
Os generator methods também podem ser definidos utilizando a sintaxe reduzida.
* g(){} funcionará, porém g *(){} não.yield. Dessa forma, generator functions legadas também não funcionarão, lançando um {{jsxref("SyntaxError")}}. Sempre utilize yield em conjunto com o asterisco (*)// Utilizando a propriedade com nome (pre-ES6)
var obj2 = {
g: function*() {
var indice = 0;
while(true)
yield indice++;
}
};
// O mesmo objeto utilizando a sintaxe reduzida
var obj2 = {
* g() {
var indice = 0;
while(true)
yield indice++;
}
};
var coisa = obj2.g();
console.log(coisa.next().value); // 0
console.log(coisa.next().value); // 1
{{jsxref("Statements/funcoes_assincronas", "Funções assíncronas", "", 1)}} também podem ser definidas usando a sintaxe reduzida.
// Utilizando a propriedade com nome (pre-ES6)
var obj3 = {
f: async function () {
await alguma_promise;
}
};
// O mesmo objeto com a sintaxe reduzida
var obj3 = {
async f() {
await alguma_promise;
}
};
Os generator methods também podem ser {{jsxref("Statements/funcoes_assincronas", "assíncronos", "", 1)}}
var obj4 = {
f: async function* () {
yield 1;
yield 2;
yield 3;
}
};
// O mesmo objeto com a sintaxe reduzida
var obj4 = {
async* f() {
yield 1;
yield 2;
yield 3;
}
};
Métodos assim definidos não são construtores e lançarão um {{jsxref("TypeError")}} se você tentar instanciá-los.
var obj = {
metodo() {},
};
new obj.metodo; // TypeError: obj.method is not a constructor
var obj = {
* g() {}
};
new obj.g; // TypeError: obj.g is not a constructor (modificado no ES2016)
var obj = {
a : "foo",
b(){ return this.a; }
};
console.log(obj.b()); // "foo"
A sintaxe reduzida também suporta nome de propriedades computados.
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
| Especificações | Estado | Comentário |
|---|---|---|
| {{SpecName('ES6', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ES6')}} | Initial definition. |
| {{SpecName('ESDraft', '#sec-method-definitions', 'Method definitions')}} | {{Spec2('ESDraft')}} |
A tabela de compatibilidade desta página é gerada a partir de dados estruturados. Se você quiser contribuir com os dados, verifique https://github.com/mdn/browser-compat-data e envie-nos um pull request.
{{Compat("javascript.functions.method_definitions")}}