--- 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')}} |
{{Compat("javascript.functions.method_definitions")}}