Esta página foi traduzida do inglês pela comunidade.Saiba mais e junte-se à comunidade MDN Web Docs.
Function.name
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since agosto de 2016.
A propriedade somente-leituraname de um objetoFunction indica o nome da função como especificado quando esta foi criada, ou"anonymous" para funções criadas anonimamente.
In this article
Experimente
const func1 = function () {};const object = { func2: function () {},};console.log(func1.name);// Expected output: "func1"console.log(object.func2.name);// Expected output: "func2"Property attributes ofFunction.name | |
|---|---|
| Writable | no |
| Enumerable | no |
| Configurable | yes |
Nota:Note que em implementações não-standard anteriores à ES2015 o atributoconfigurable tinha também o valorfalse.
Exemplos
>Nome de declaração da função
A propriedadename retorna o nome de uma declaração de função.
function doSomething() {}doSomething.name; // "doSomething"Nome do construtor da função
Funções criadas com a sintaxenew Function(...) ou somenteFunction(...) criam objetosFunction com o nome "anonymous".
(new Function).name; // "anonymous"
Nomes de função inferidos
Variáveis e métodos podem inferir o nome de uma função anônima a partir de sua posição sintática (novo na ECMAScript 2015).
var f = function () {};var object = { someMethod: function () {},};console.log(f.name); // "f"console.log(object.someMethod.name); // "someMethod"Você pode definir uma função com um nome numaexpressão de função:
var object = { someMethod: function object_someMethod() {},};console.log(object.someMethod.name); // grava o log "object_someMethod"try { object_someMethod;} catch (e) { console.log(e);}// ReferenceError: object_someMethod is not definedVocê não pode mudar o nome de uma função, pois a propriedade é somente-leitura:
var object = { // anonymous someMethod: function () {},};object.someMethod.name = "otherMethod";console.log(object.someMethod.name); // someMethodPara mudá-lo, você poderia no entanto usarObject.defineProperty().
Nomes curtos de métodos
var o = { foo() {},};o.foo.name; // "foo";Nomes de funções vinculadas
Function.bind() produz uma função cujo nome é "bound " seguido do nome da função.
function foo() {}foo.bind({}).name; // "bound foo"Nomes de função paragetters esetters
Ao usar propriedades acessóriasget eset, "get" ou "set" aparecerão no nome da função.
var o = { get foo() {}, set foo(x) {},};var descriptor = Object.getOwnPropertyDescriptor(o, "foo");descriptor.get.name; // "get foo"descriptor.set.name; // "set foo";Nomes de funções em classes
Você pode usarobj.constructor.name para checar a "classe" de um objeto (porém leia com atenção os avisos abaixo):
function Foo() {} // Sintaxe ES2015: class Foo {}var fooInstance = new Foo();console.log(fooInstance.constructor.name); // grava o log "Foo"Aviso:O interpretador vai definir a propriedade internaFunction.name somente se uma função não tiver uma propriedade já com o nomename (veja a seção9.2.11 da ECMAScript2015 Language Specification). Porém, a ES2015 especifica que a palavra-chavestatic de maneira que métodos estáticos serão definidos como OwnProperty da função construtora de classe (ECMAScript2015,14.5.14.21.b +12.2.6.9).
Portanto não podemos obter o nome de virtualmente qualquer classe com um método estáticoname():
class Foo { constructor() {} static name() {}}Com um métodostatic name(),Foo.name não guarda mais o nome verdadeiro da classe mas uma referência ao objeto de funçãoname(). A definição de classe acima, escrita em sintaxe ES2015, se comportará de maneira similar ao seguinte trecho de código em sintaxe ES5 no Chrome ou no Firefox:
function Foo() {}Object.defineProperty(Foo, "name", { writable: true });Foo.name = function () {};Tentar obter a classe defooInstance viafooInstance.constructor.name não nos dará de maneira alguma o nome da classe, mas sim uma referência ao método estático da classe. Exemplo:
var fooInstance = new Foo();console.log(fooInstance.constructor.name); // grava o name() da função no logVocê pode ver também, a partir do exemplo de sintaxe ES5, que, no Chrome ou no Firefox, a nossa definição estática deFoo.name se tornawritable. A predefinição interna na ausência de uma definição estática customizada é somente-leitura:
Foo.name = "Hello";console.log(Foo.name); // logs "Hello" if class Foo has a static name() property but "Foo" if not.Portanto, você não pode assumir que a propriedade internaFunction.name sempre guardará um nome de classe..
Símbolos como nome de função
Se umSymbol é usado como nome de função e o símbolo tem uma descrição, o nome do método será a descrição entre colchetes.
var sym1 = Symbol("foo");var sym2 = Symbol();var o = { [sym1]: function(){}, [sym2]: function(){}};o[sym1].name; // "[foo]"o[sym2].name; // ""Compressores e minificadores JavaScript
Aviso:Tenha cuidado ao usarFunction.name e transformações de código-fonte, como aquelas executadas por compressores (minificadores) ou obfuscadores de JavaScript. Estas ferramentas são comumente usadas como parte de processos debuild de JavaScript para reduzir os tamanhos de programas antes da implementação em produção. Tais transformações frequentemente mudam nomes de função durante obuild.
Código fonte do tipo:
function Foo() {}var foo = new Foo();if (foo.constructor.name === "Foo") { console.log("'foo' is an instance of 'Foo'");} else { console.log("Oops!");}pode ser comprimido e se tornar:
function a() {}var b = new a();if (b.constructor.name === "Foo") { console.log("'foo' is an instance of 'Foo'");} else { console.log("Oops!");}Na versão descomprimida, o programa cai no bloco-verdade e grava o log'foo' is an instance of 'Foo'. Todavia, na versão comprimida ele se comporta diferentemente, e cai no blocoelse. Se você depende deFunction.name, como no exemplo acima, tenha certeza que seu processo debuild não mude nomes de função, ou então não assuma que uma função terá um nome determinado.
Especificações
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-function-instances-name> |