Orientação à Objeto Baseada em Protótipo

Introdução

É um paradigma de programação baseada em protótipo, que é um estilo de programação orientada a objetos.

A reutilização de comportamento é realizada por meio de um processo de reutilização de objetos existentes que servem como protótipos.

Todos os objetos herdam propriedades e métodos de um prototype. O objeto Object.prototype está no topo desta cadeia.

Esse modelo também pode ser conhecido como programação prototípica, orientada a protótipos, sem classes ou baseada em instâncias.

Aplicável em todos os tipos de dados não primitivos.

Herança

A herança é feita por meio de protótipos, cadeia de protótipos, onde vai herdando propriedades e métodos até o topo da cadeia. O topo da cadeia é a classe Object.

Tudo isso o JS faz por debaixo dos panos.

Classes

Classes não existem nativamente no JS, elas são uma Syntatic Sugar, ou seja, uma sintaxe feita para facilitar a escrita. Criada no ES6.

Todas as classes são objetos e a herança se dá por protótipos.

É uma forma simplificada para funções "fábricas" (Factory Functions), que é uma função que retorna um objeto, instância da classe especificada.

class é uma palavra chave para declarar uma classe. É super sintaxe das funções.

OBS: Por baixo dos panos é criado um prototype para cada classe.
Link para testar e verificar em: https://babeljs.io/

Modificadores de Acesso

JS não tem modificadores de acesso, porém existe uma implementação no ES6 que permite a definição de modificadores de acesso na versão 12 Node.js, mas, ainda não tem suporte nos browsers.

Class-based vs. prototype-based languages

Class-based vs. prototype-based languages

Categoria Baseado em classe (Java) Baseado em protótipo (JavaScript)
Classe x instância Classe e instância são entidades distintas. Todos os objetos podem herdar de outro objeto.
Definição Defina uma classe com uma definição de classe; instanciar uma classe com métodos construtores. Defina e crie um conjunto de objetos com funções construtoras.
Criação de um novo objeto Crie um único objeto com o newoperador. Mesmo
Construção da hierarquia de objetos Construa uma hierarquia de objetos usando definições de classe para definir subclasses de classes existentes. Construa uma hierarquia de objetos atribuindo um objeto como o protótipo associado a uma função construtora.
Modelo de herança Herde propriedades seguindo a cadeia de classes. Herde propriedades seguindo a cadeia de protótipos.
Extensão de propriedades A definição de classe especifica todas as propriedades de todas as instâncias de uma classe. Não é possível adicionar propriedades dinamicamente em tempo de execução. A função construtora ou protótipo especifica um conjunto inicial de propriedades. Pode adicionar ou remover propriedades dinamicamente para objetos individuais ou para todo o conjunto de objetos.

Classes são mais rigidas e protótipos são mais flexíveis.

Exemplos ES5 e ES6

Como era no ES5 vs. como é no ES6 com a criação da Syntatic Sugar.

References