Pergunta

Em JavaScript, cada objeto é ao mesmo tempo uma instância e uma classe. Para fazer herança, você pode usar qualquer instância do objeto como um protótipo.

Em Python, C ++, etc .. há classes e instâncias, como conceitos separadas. Para fazer a herança, você tem que usar a classe base para criar uma nova classe, que pode então ser usado para produzir casos derivados.

Por que JavaScript ir nessa direção (orientação a objetos com base em protótipo)? quais são as vantagens (e desvantagens) de OO baseada em protótipo com respeito a OO tradicional, baseada em classes?

Foi útil?

Solução

Existem cerca de cem questões de terminologia aqui, quase todo construído em torno de alguém (não você) tentando fazer a sua ideia som como o melhor.

Todas as linguagens orientadas a objeto precisa ser capaz de lidar com vários conceitos:

  1. encapsulamento de dados, juntamente com as operações associadas sobre os dados, variadamente conhecidas como membros de dados e funções de membro, ou como dados e métodos, entre outras coisas.
  2. herança, a capacidade de dizer que esses objetos são apenas como aquele outro conjunto de objetos, exceto para essas mudanças
  3. polimorfismo ( "muitas formas"), no qual um objeto decide por si quais os métodos estão a ser executado, de modo que você pode depender da língua para encaminhar seus pedidos corretamente.

Agora, tanto quanto comparação:

A primeira coisa é toda a "classe" contra a pergunta "protótipo". A idéia começou originalmente no Simula, onde, com um método baseado em classes cada classe representava um conjunto de objetos que compartilham o mesmo espaço de estado (leia-se "valores possíveis") e as mesmas operações, formando assim uma classe de equivalência. Se você olhar para trás, Smalltalk, desde que você pode abrir uma classe e adicionar métodos, este é efetivamente o mesmo que o que você pode fazer em Javascript.

linguagens OO posteriores queria ser capaz de usar a verificação de tipo estático, por isso temos a noção de um conjunto de classe fixado em tempo de compilação. Na versão de classe aberta, você tinha mais flexibilidade; na versão mais recente, você teve a capacidade de verificar alguns tipos de correção no compilador que teria exigido o teste.

Em uma linguagem "base-class", que a cópia acontece em tempo de compilação. Em uma linguagem protótipo, as operações são armazenadas na estrutura de dados protótipo, que é copiado e modificado em tempo de execução. Abstratamente, porém, uma classe ainda é a classe de equivalência de todos os objetos que compartilham o mesmo espaço de estado e métodos. Quando você adicionar um método para o protótipo, você está fazendo efetivamente um elemento de uma nova classe de equivalência.

Agora, por que fazer isso? principalmente porque ele faz para um simples, lógico mecanismo, elegante em tempo de execução. agora, para criar um novo objeto, ou para criar uma nova classe, você simplesmente tem que executar uma cópia profunda, copiando toda a estrutura de dados protótipo de dados e. Você começa herança e polimorfismo mais ou menos de graça, então: método de pesquisa sempre consiste em pedir um dicionário para a implementação do método pelo nome

.

A razão que acabou em Javascript ECMA script / é basicamente que, quando estávamos começando com este 10 anos atrás, estávamos lidando com computadores muito menos poderosos e muito navegadores menos sofisticados. Escolhendo o método baseado em protótipo significava o intérprete poderia ser muito simples, preservando as propriedades desejáveis ??de orientação a objetos.

Outras dicas

A comparação, que é ligeiramente inclinado para abordagem baseada em protótipos, pode ser encontrada no papel - Auto: O poder da simplicidade . O documento faz as seguintes argumentos em favor de protótipos:

Criação copiando . Criação de novos objetos de protótipos é realizado por uma operação simples, copiar, com uma metáfora biológica simples, a clonagem. criando novos objectos a partir de classes é realizado por instanciação, que inclui o interpretação das informações de formato em uma classe. instanciação é semelhante ao construir uma casa a partir de um plano. Copiando apelos para nós como uma metáfora simples de instanciação.

<> fortes Exemplos de módulos pré-existentes fortes. Protótipos são mais concretos do que as classes porque eles são exemplos de objetos ao invés de descrições de formato e de inicialização. Esses exemplos podem ajudar os usuários a módulos de reutilização, tornando-os mais fáceis de Compreendo. Um sistema baseado em protótipo permite ao usuário examinar um típico representante em vez de exigir-lhe para dar sentido a sua descrição.

Suporte para one-of-a-kind objetos . Auto fornece uma estrutura que pode facilmente incluir objetos um-de-um-tipo com seu próprio comportamento. Uma vez que cada objeto tem ranhuras nomeados e slots podem manter o estado ou comportamento, qualquer objeto pode ter ranhuras únicas ou comportamento. sistemas baseados em classe são projetados para situações onde há muitos objetos com o mesmo comportamento. Não há apoio linguístico para um objeto de possuir o seu próprio comportamento único, e é estranho ( acho Singleton padrão ) para criar uma classe que é garantido para ter apenas uma instância. Auto sofre de nenhuma dessas desvantagens. Qualquer objeto pode ser personalizado com seu próprio comportamento. Uma lata objeto único segure o comportamento único, e não é necessária uma "instância" separado.

Eliminação de meta-regressão . Nenhum objeto em um sistema baseado em classes pode ser auto-suficiente; um outro objecto (a sua classe) é necessário para expressar a sua estrutura e comportamento. Isto leva a uma conceptualmente infinito meta-regress: um point é uma instância da classe Point, que é um exemplo de Point metaclass, que é um exemplo de metametaclass Point, ad infinitum. Por outro lado, em sistemas baseados em protótipos de um objeto pode incluir o seu próprio comportamento; nenhum outro objeto é necessária para dar vida a ele. protótipos eliminar meta-regressão.

Auto é provavelmente a primeira língua para implementar protótipos. (Ele também foi pioneiro outras tecnologias interessantes como JIT, que mais tarde fez o seu caminho para a JVM. Assim, a leitura os outros papéis auto também deve ser instrutivo).

Você deve verificar se a href="https://rads.stackoverflow.com/amzn/click/com/0596517742" rel="nofollow noreferrer"> grande livro por Douglas Crockford . Ele fornece uma boa explicação de algumas das decisões de design tomadas por criadores de JavaScript.

Um dos aspectos importantes do projeto de JavaScript é seu sistema de herança prototípica. Os objetos são cidadãos de primeira classe em JavaScript, tanto que funções regulares também são implementados como objetos (objeto 'função' para ser preciso). Na minha opinião, quando foi originalmente projetado para rodar dentro de um navegador, ele foi concebido para ser usado para criar lotes de objetos únicos. Em DOM navegador, você achar que a janela, documento etc todos os objetos únicos. Além disso, JavaScript é vagamente digitado linguagem dinâmica (em oposição a dizer Python que é fortemente digitado, linguagem dinâmica), como resultado, um conceito de extensão objeto foi implementado através do uso de propriedade 'protótipo'.

Então, eu acho que existem alguns profissionais para OO baseada em protótipo, como implementado em JavaScript:

  1. Indicado em ambientes vagamente digitadas, não há necessidade de definir tipos explícitos.
  2. torna incrivelmente fácil de implementar padrão Singleton (compare JavaScript e Java, a este respeito, e você sabe do que estou falando).
  3. Fornece maneiras de aplicar um método de um objeto no contexto de um objeto diferente, adicionando e substituindo métodos dinamicamente a partir de um objeto etc. (coisas que não são possíveis em um idiomas rigidez).

Aqui estão alguns dos contras de OO prototypal:

  1. No caminho mais fácil de implementar variáveis ??privadas. Sua possível implementar vars privadas usando Crockford de magia usando fechamentos , mas sua definitivamente não é tão trivial como a utilização de variáveis ??privadas em dizer Java ou C #.
  2. eu não sei como implementar várias heranças (para que o seu valor) em JavaScript ainda.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top