DEV Community

welingtoncassis
welingtoncassis

Posted on

1 1

Herança em JavaScript com prototype e function

Herança de objetos é um princípio de orientação a objetos e fornece a habilidade de acessar métodos e propriedades de outro objeto (pai) a partir de um objeto derivado (filho). Herança em javascript é possível através do prototype ou seja herança de protótipo.

O javascript disponibiliza a palavra chave class - a palavra-chave class foi introduzida no ES2015, mas é syntax sugar, o JavaScript permanece baseado em prototype - para declarar classes e extends para fazer herança. Nesse post irei usar a abordagem function e prototype para detalhar o processo de herança e prototype chain.

Prototype chain(Processo de pesquisa nos prototype)

No javascript quando vamos acessar uma propriedade de um objeto o motor do javascript vai verificar se existe essa propriedade no objeto e caso não encontre i*rá procurar no prototype do objeto* e se também não encontrar irá procurar no prototype do prototype e assim por diante passando por todas as instâncias que foram herdadas até chegar ao último prototype. Caso não encontre o JS irá retornar undefined.

Para acessar as informações do prototype utilizamos __proto__ e com ele podemos acessar informações de outros prototypes acima (mais genéricos).

Vejamos o seguinte exemplo onde temos três objetos em que a classe mais baixa Diretor herda características de Professor e Funcionário:

function Funcionario() {}
Funcionario.prototype.salario = () => 'R$ 10000'

function Professor() {}
Professor.prototype = Object.create(Funcionario.prototype)
Professor.prototype.horaExtra = () => 'R$ 500'

function Diretor() {}
Diretor.prototype = Object.create(Professor.prototype)
Diretor.prototype.bonus = () => 'R$ 2000'
Enter fullscreen mode Exit fullscreen mode

Agora vamos inicializar o objeto Diretor e acessar o método salario() que foi herdado:

const diretor = new Diretor();
console.log(diretor.salario()); //output => 'R$ 10000'
Enter fullscreen mode Exit fullscreen mode

Isso foi possível porque quando chamamos o método salario() o motor do javascript verificou se esse método existia no prototype de Diretor e como não encontrou foi "subindo" passando de prototype em prototype até encontar o método no prototype de Funcionario.

Utilize __proto__ e veja a cadeia de prototype (prototype chain) através instância mais baixa que é Diretor:

console.log(diretor.__proto__) //output => prototype Diretor
console.log(diretor.__proto__.__proto__) //output => prototype Professor
console.log(diretor.__proto__.__proto__.__proto__) //output => prototype Funcionario

Enter fullscreen mode Exit fullscreen mode

Conclusão

É muito importante entender bem "herança de protótipo" no javascript para escrever códigos complexos. Evite que sua cadeia de protótipos seja grande e quebre a cadeia caso necessário para evitar problemas de performance.

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay