W3docs

Membros Estáticos de Classes JavaScript

Aprenda propriedades e métodos estáticos em JavaScript: como defini-los com a palavra-chave static, herdá-los em subclasses, criar factory methods, usar blocos de inicialização estática e como this se comporta dentro de um método estático.

Propriedades e métodos estáticos pertencem à classe em si, não às instâncias criadas a partir dela. Isso significa que você os chama diretamente pelo nome da classe — sem precisar usar new. Eles são a ferramenta certa para funções utilitárias e constantes compartilhadas que dizem respeito à classe como um todo, e não a qualquer objeto específico.

Se você já usou os objetos internos do JavaScript, já utilizou membros estáticos sem nomeá-los dessa forma:

  • Date.now() retorna o timestamp atual — você o chama em Date, não em uma instância de data.
  • Array.from(iterable) constrói um array — chamado na classe Array, não em um array existente.
  • Object.keys(obj) lista as chaves próprias de um object — chamado em Object.
  • Math.max(...) e Number.isInteger(...) também são estáticos.

Este capítulo explica como definir suas próprias propriedades e métodos estáticos, como eles são herdados por subclasses, como this se comporta dentro deles e os padrões comuns (factory methods e blocos de inicialização estática) que você usará em código real. Se classes são algo novo para você, comece com sintaxe básica de classes primeiro.

Definindo Propriedades e Métodos Estáticos

Propriedades e métodos estáticos são definidos usando a palavra-chave static dentro do corpo de uma classe. Veja como defini-los e usá-los:


javascript— editable

Neste exemplo, pi é uma propriedade estática e sum é um método estático da classe Calculator. Eles podem ser acessados diretamente pelo nome da classe, sem precisar instanciá-la.

Nota: A sintaxe de campo de classe estático (static pi = ...) requer ES2022+ ou um transpilador como o Babel. Além disso, um método estático não pode acessar as propriedades de uma instância através de this, pois pertence à própria classe e não a qualquer instância específica.

this Dentro de um Método Estático

Dentro de um método estático, this se refere à classe, não a uma instância. Isso permite que um método estático chame outro método estático ou leia uma propriedade estática na mesma classe:


javascript— editable

Como this resolve para a classe, o mesmo método estático se comporta de forma diferente dependendo de qual classe ele é chamado — um detalhe importante quando a herança entra em cena (veja a próxima seção).

Herdando Membros Estáticos em Subclasses

Propriedades e métodos estáticos são herdados. Quando uma subclasse faz extends de uma classe pai, ela obtém acesso aos membros estáticos do pai e pode chamá-los pelo seu próprio nome:


javascript— editable

Aqui, Advanced.sum é herdado de Calculator. Dentro de Advanced.double, this é Advanced, então this.sum(...) encontra sum na cadeia de protótipos.

Como this aponta para a classe em que o método foi chamado, uma subclasse pode sobrescrever um membro estático e os outros métodos estáticos do pai usarão a versão sobrescrita quando chamados através da subclasse:


javascript— editable

Para saber mais sobre extensão de classes, veja herança de classes.

Factory Methods Estáticos

Um padrão comum é o factory method: um método estático que constrói e retorna uma instância da classe, frequentemente a partir de dados em um formato diferente. Isso mantém a lógica de construção em um lugar nomeado e torna o código de chamada mais legível.

Um exemplo típico é criar um object a partir de uma string JSON ou de um object simples recebido de uma API:


javascript— editable

Usar new this(...) em vez de new User(...) significa que uma subclasse que chama fromJSON automaticamente recebe uma instância da subclasse.

Quando Usar Propriedades Estáticas

Propriedades estáticas são ideais para constantes relacionadas a uma classe que permanecem inalteradas, independentemente da instância. Elas fornecem uma forma de acessar dados compartilhados de qualquer lugar no seu código. Por exemplo, se você tem uma classe que lida com interações de usuário, pode ter uma propriedade estática que define configurações padrão ou limites:


javascript— editable

Para constantes que nunca devem ser reatribuídas de fora da classe, considere combinar campos estáticos com membros privados (static #secret = ...).

Blocos de Inicialização Estática

Às vezes, uma propriedade estática precisa de mais do que uma única expressão para ser configurada — por exemplo, depende de vários outros estáticos, requer um loop ou precisa de um try/catch. O ES2022 adicionou os blocos de inicialização estática (static { ... }) exatamente para isso. O bloco é executado uma vez, quando a classe é definida, com this vinculado à classe:


javascript— editable

Você pode ter mais de um bloco estático, e eles são executados na ordem do código junto com os inicializadores de campos estáticos. São ideais para configurações computadas que seriam difíceis de expressar como uma única atribuição de campo.

Vantagens de Usar Propriedades e Métodos Estáticos

  • Eficiência de Memória: Como propriedades e métodos estáticos estão vinculados à classe em si e não às instâncias, eles evitam a duplicação de dados ou funções para cada object, o que pode reduzir o uso de memória quando muitas instâncias são criadas.
  • Conveniência: Métodos estáticos podem ser chamados sem instanciar a classe, tornando-os convenientes para funções utilitárias.
  • Código Organizado: Ao agrupar funcionalidades relacionadas diretamente dentro das classes como membros estáticos, o código fica organizado e as áreas funcionais ficam claramente definidas.

Resumo

  • Membros estáticos são declarados com a palavra-chave static e existem na classe, não nas instâncias — chame-os como NomeDaClasse.membro.
  • Objetos internos conhecidos como Date.now(), Array.from() e Object.keys() são métodos estáticos.
  • Dentro de um método estático, this é a classe em que foi chamado. Subclasses herdam membros estáticos e podem sobrescrevê-los, e this é resolvido de acordo.
  • Use factory methods (static fromJSON(...) retornando new this(...)) para centralizar a construção de objetos, e blocos de inicialização estática (static { ... }, ES2022) para configurações que precisam de mais do que uma única expressão.
  • Recorra a membros estáticos para utilitários e constantes compartilhadas; use métodos regulares (de instância) para comportamentos que dependem dos dados de um object específico.

Próximos passos

Prática

Prática
Quais afirmações são verdadeiras sobre propriedades e métodos estáticos em JavaScript?
Quais afirmações são verdadeiras sobre propriedades e métodos estáticos em JavaScript?
Was this page helpful?