O que significa que Javascript é uma linguagem baseada em Protótipo?

Uma das principais vantagens do Javascript é que ele é um protótipo de linguagem baseada.

mas o que significa que o Javascript é baseado em protótipo, e porque é que isso é uma vantagem?

Author: Tom van der Woerdt, 2008-10-09

7 answers

A herança prototípica é uma forma de reutilização de código orientada a objetos . Javascript é uma das únicas linguagens orientadas a objetos [mainstream] a usar a herança prototípica. Quase todas as outras linguagens orientadas a objetos são clássicas.

Em herança clássica, o programador escreve uma classe, que define um objecto. Vários objetos podem ser instanciados da mesma classe, então você tem código em um lugar que descreve vários objetos em seu programa. Classes podem então ser organizadas em uma hierarquia, promovendo a reutilização de código. O código mais geral é armazenado em uma classe de nível superior, a partir da qual classes de nível inferior herdam. Isto significa que um objeto está compartilhando código com outros objetos da mesma classe, bem como com suas classes-mãe.

Na formada herança prototípica , os objectos herdam directamente de outros objectos. Todos os negócios sobre aulas desaparecem. Se você quer um objeto, você apenas escreve um objeto. Mas reutilização de código ainda é uma coisa valiosa, então os objetos podem ser ligados em conjunto em uma hierarquia. Em javascript, cada objeto tem um link secreto para o objeto que o criou, formando uma cadeia. Quando um objeto é pedido para uma propriedade que ele não tem, seu objeto-mãe será perguntado... subindo continuamente a cadeia até que a propriedade seja encontrada ou até que o objeto raiz seja alcançado.

Cada função em JavaScript (que são os próprios objectos) tem um membro chamado "protótipo", que é responsável por fornecer valores quando um objeto é solicitado por eles. Ter este membro permite que o mecanismo construtor (pelo qual os objetos são construídos a partir de funções) para funcionar. A adição de uma propriedade ao protótipo de um objeto de função irá torná-lo disponível para o objeto construído, bem como para todos os objetos que herdam dele.

Vantagens

Pode não haver uma regra dura e rápida sobre a razão pela qual a herança prototípica é uma forma vantajosa de reutilização de código. A reutilização de código em si é vantajosa, e a herança prototípica é uma maneira sensata de fazer isso. Você pode argumentar que a herança prototípica é um modelo bastante simples de reutilização de código, e que o código pode ser fortemente reutilizado em formas diretas. Mas as línguas clássicas são certamente capazes de conseguir isso também.

Sidenote: @Andrew Hedges faz um bom ponto de vista, que existem realmentemuitas línguas prototipais. Vale a pena. notando que esses outros existem, mas também vale a pena notar que nenhum deles é nada perto do mainstream. NewtonScript parecia ter alguma tração por um tempo, mas morreu com sua plataforma. Também é possível estender algumas línguas modernas de maneiras que adicionam capacidades prototipais.

 260
Author: keparo, 2016-12-02 06:18:03

Uma linguagem baseada em protótipos, não faz a distinção entre classes e objectos: simplesmente tem objectos. Uma linguagem baseada em protótipos tem a noção de um objeto prototípico, um objeto usado como um modelo a partir do qual obter as propriedades iniciais para um novo objeto. Qualquer objeto pode especificar suas próprias propriedades, seja quando você cria ou em tempo de execução. Além disso, qualquer objecto pode ser associado como protótipo para outro objecto , permitindo que o segundo objecto partilhe o primeiro propriedades do objecto.

 48
Author: Guido, 2008-10-09 07:26:18

Programação baseada em protótipos é um estilo de programação orientada a objetos onde as classes não estão presentes, e reutilização de comportamento (ou herança em linguagens baseadas em classes) é realizada pela clonagem de objetos existentes que servem como protótipos.

 29
Author: CMS, 2008-10-09 07:27:12

A vantagem/desvantagem é que, podemos criar novos tipos de objectos em tempo de execução sem necessidade de definir classes (código estático). Como a maioria dos recursos, cabe ao Desenvolvedor transformá-lo em uma vantagem/desvantagem.

Acima é possível porque os objetos são essencialmente funções em java script (fechamentos também).

 10
Author: questzen, 2008-10-09 07:45:21

Em vez de declarar uma estrutura de classe, você pode criar objetos do mesmo tipo, e Adicionar à sua definição sempre que quiser usando o protótipo do objeto. É mais flexível do que a maneira normal de fazer as coisas.

 5
Author: Greg, 2008-10-09 07:25:55

Se você apenas usar objetos em tempo de execução em vez de uma classe em compile para construir novos objetos, isso abre a possibilidade de estender um objeto sem saber quaisquer detalhes sobre ele. Claro, pode tornar-se uma desvantagem muito rapidamente, dependendo do uso. Eu não faço suposições sobre a linguagem aqui, por isso é aplicável a outras linguagens que não javascript que não são tão dinâmicos.

myobject.prototype=unkownobject;
myobject.newproperty=1;

Você pode obter o objeto de qualquer lugar; seu próprio código, a partir da rede, de a base de dados, a partir de ligações externas e assim por diante.

Note que, uma linguagem não precisa implementar uma herança protótipo como javascript. Em javascript, um objeto protótipo é meramente compartilhado, assim como suas propriedades, entre os herdeiros. A alternativa é copiar sobre todas as propriedades do protótipo para o novo objeto. Cada abordagem tem os seus pontos fortes em diferentes situações. Gosto mais da segunda, mas não é o que o javascript faz.

 5
Author: artificialidiot, 2008-10-09 08:14:09
Depois de ler todas as respostas, esta é a conclusão.

1) herança na qual os objectos são herdados directamente de outros objectos

2) que não utiliza classes

3) também chamado de programação baseada em instância ou programação orientada por protótipo sem classe

4) a reutilização do comportamento é realizada através da clonagem de objectos existentes que servem como protótipos

5) objecto usado como modelo a partir do novo objecto obter propriedades iniciais

 3
Author: Sunil Garg, 2016-06-10 12:19:03