Na programação orientada a objetos, a herança é um mecanismo que permite que uma classe (ou objeto) herde propriedades e métodos de outra classe (ou objeto). Em JavaScript, a herança é baseada em protótipos, que é uma forma de compartilhar comportamentos entre objetos.
Para entender melhor a herança em JavaScript, é importante entender o conceito de protótipos. Cada objeto em JavaScript tem um protótipo, que é outro objeto do qual o objeto herda propriedades e métodos. O protótipo pode ser definido explicitamente através da propriedade __proto__
ou implicitamente através da função construtora ou de uma classe.
A prototipagem é a base da herança em JavaScript. Quando um objeto é criado, ele herda propriedades e métodos de seu protótipo. Se um método ou propriedade não está definido no objeto atual, o JavaScript procura pelo mesmo no protótipo do objeto e assim por diante, até encontrar ou chegar ao protótipo base Object.prototype
.
A herança em JavaScript pode ser implementada de diversas maneiras. Uma delas é através do uso de funções construtoras e da propriedade prototype
. Ao criar uma função construtora, pode-se definir propriedades e métodos na propriedade prototype
, que serão herdados por todos os objetos criados a partir desta função. Por exemplo:
javascriptfunction Pessoa(nome, idade) {
this.nome = nome;
this.idade = idade;
}
Pessoa.prototype.falar = function() {
console.log('Olá, meu nome é ' + this.nome + ' e eu tenho ' + this.idade + ' anos.');
}
var pessoa1 = new Pessoa('João', 30);
pessoa1.falar(); // 'Olá, meu nome é João e eu tenho 30 anos.'
Neste exemplo, a função construtora Pessoa
define as propriedades nome
e idade
na criação do objeto. Além disso, o método falar
é definido na propriedade prototype
, permitindo que todos os objetos criados a partir da função tenham acesso ao método.
Outra forma de implementar herança em JavaScript é através do uso de classes (introduzido na versão ES6 do JavaScript). Classes são uma forma mais clara e legível de definir a herança em JavaScript, mas por baixo dos panos, elas ainda são baseadas em protótipos. Por exemplo:
javascriptclass Pessoa {
constructor(nome, idade) {
this.nome = nome;
this.idade = idade;
}
falar() {
console.log('Olá, meu nome é ' + this.nome + ' e eu tenho ' + this.idade + ' anos.');
}
}
var pessoa1 = new Pessoa('João', 30);
pessoa1.falar(); // 'Olá, meu nome é João e eu tenho 30 anos.'
Neste exemplo, a classe Pessoa
define as propriedades nome
e idade
no construtor e o método falar
na definição da classe. A sintaxe é mais clara, mas por baixo dos panos, o JavaScript ainda está criando uma função construtora e definindo a propriedade prototype
para criar o protótipo da classe.