O que são Propriedades e Métodos Estáticos em Classes?
Propriedades e métodos estáticos pertencem à própria classe, não às instâncias individuais da classe. Você pode acessá-los diretamente pelo nome da classe sem criar uma instância da classe. Eles são definidos dentro de classes para encapsular funcionalidades relacionadas.
Você pode definir um método estático escrevendo a palavra-chave
static antes do nome do método.
class MyClass {
static staticMethod() { ... }
}
Então, você pode chamar o método estático diretamente na classe, usando a notação de ponto e passando quaisquer argumentos necessários:
MyClass.staticMethod();
Observe que você pode chamar o método sem criar uma instância da classe. Essa é uma das principais características dos métodos estáticos.
Aqui está um exemplo. Vamos supor que estamos criando um aplicativo de filmes e queremos ser capazes de comparar filmes com base na sua avaliação.
Poderíamos considerar este método de comparação como um método de nível superior que não é específico para nenhum filme:
if (movieA.rating < movieB.rating) {
console.log(${movieB.title} has a higher rating.);
}
É como um método mais geral relacionado à classe Movie.
Para fins de legibilidade e manutenção, seria útil defini-lo dentro da classe Movie para manter todos os métodos relacionados relativamente próximos uns dos outros.
Portanto, este é um candidato perfeito para um método estático. Você pode ver isso aqui, logo abaixo do construtor:
class Movie {
constructor(title, rating) {
this.title = title;
this.rating = rating;
}
static compareMovies(movieA, movieB) {
if (movieA.rating > movieB.rating) {
console.log(${movieA.title} has a higher rating.);
} else if (movieA.rating < movieB.rating) {
console.log(${movieB.title} has a higher rating.);
} else {
console.log("These movies have the same rating.");
}
}
}
let movieA = new Movie("Movie A", 80);
let movieB = new Movie("Movie B", 45);
console.log(movieA);
O método estático é definido com a palavra-chave static e é chamado de compareMovies. Ele tem dois parâmetros: movieA e movieB. Estas serão instâncias da classe Movie.
Nós os compararemos com base na avaliação, em uma escala de 0 a 100. Esta lógica é implementada com uma condicional e ela imprimirá uma mensagem apropriada baseada em qual filme tem uma avaliação mais alta.
Uma vez que o método tenha sido definido, você pode chamá-lo na classe. Mas primeiro, você precisa ter os argumentos prontos e definidos no seu programa.
Neste caso, o método recebe duas instâncias de filme como argumentos, então definimos essas instâncias aqui:
let movieA = new Movie("Movie A", 80);
let movieB = new Movie("Movie B", 45);
Você pode ver que movieA tem uma avaliação mais alta que movieB. Vamos ver a saída deste método.
Para chamar o método, você só precisa usar a notação de ponto na própria classe. Você escreve o nome da classe (Movie), seguido por um ponto, e então o nome do método estático (compareMovies).
Então, você passa os argumentos dentro dos parênteses. Neste caso, eles são as duas instâncias de filme que o método requer.
Movie.compareMovies(movieA, movieB);
Aqui está o exemplo atualizado:
class Movie {
constructor(title, rating) {
this.title = title;
this.rating = rating;
}
static compareMovies(movieA, movieB) {
if (movieA.rating > movieB.rating) {
console.log(${movieA.title} has a higher rating.);
} else if (movieA.rating < movieB.rating) {
console.log(${movieB.title} has a higher rating.);
} else {
console.log("These movies have the same rating.");
}
}
}
let movieA = new Movie("Movie A", 80);
let movieB = new Movie("Movie B", 45);
Movie.compareMovies(movieA, movieB);
console.log(movieA);
Métodos estáticos também são úteis para implementar métodos "factory". Um método factory é um método que você define além do construtor para criar objetos com base em critérios específicos.
Aqui está um exemplo com uma classe Pizza. O método estático createMargherita é um método factory que você pode chamar para criar uma instância de pizza Margherita com seu tipo e preço já definidos.
class Pizza {
constructor(type, price) {
this.type = type;
this.price = price;
}
static createMargherita() {
return new this("Margherita", 6.99);
}
}
Isso também traz algo muito importante sobre métodos estáticos.
O valor da palavra-chave this em métodos estáticos é a própria classe, já que o método estático pertence à classe.
É por isso que podemos usar this para criar uma nova instância da classe Pizza.
Se você chamar este método na própria classe Pizza e atribuir a instância retornada a uma variável, como neste exemplo:
let myPizza = Pizza.createMargherita();
Você pode usá-lo onde quer que precise no seu código. Por exemplo, você pode imprimir isso no console:
console.log(myPizza);
Este é o output:
Pizza { type: 'Margherita', price: 6.99 }
Você também pode usar a notação de ponto para chamar seus métodos e acessar suas propriedades, assim:
console.log(myPizza.type);
Aqui está o exemplo completo:
class Pizza {
constructor(type, price) {
this.type = type;
this.price = price;
}
static createMargherita() {
return new this("Margherita", 6.99);
}
}
let myPizza = Pizza.createMargherita();
console.log(myPizza);
console.log(myPizza.type);
Além dos métodos, você também pode definir propriedades estáticas com a palavra-chave static.
Neste exemplo, temos uma propriedade estática numberOfPizzasSold.
class Pizza {
static numberOfPizzasSold = 0;
constructor(type) {
this.type = type;
Pizza.numberOfPizzasSold++;
}
}
É estático porque não pertence a nenhuma instância específica de pizza, pertence à própria classe.
Ele tem um valor inicial de 0 e é atualizado toda vez que uma nova instância é criada.
Se você criar duas instâncias de pizza, o valor será atualizado duas vezes:
let pizza1 = new Pizza("Margherita");
let pizza2 = new Pizza("Neapolitan");
Para acessar o valor de uma propriedade estática, você só precisa usar a notação de ponto na própria classe, já que a propriedade pertence à classe.
class Pizza {
static numberOfPizzasSold = 0;
constructor(type) {
this.type = type;
Pizza.numberOfPizzasSold++;
}
}
let pizza1 = new Pizza("Margherita");
let pizza2 = new Pizza("Neapolitan");
console.log(Pizza.numberOfPizzasSold);
Neste caso, a saída é 2 porque duas pizzas foram vendidas.
Estes são os fundamentos das propriedades e métodos estáticos em JavaScript. Entender membros estáticos é essencial para criar classes reutilizáveis e eficientes.Este módulo não possui perguntas. Marque como concluído.