O que significa que o Javascript é uma linguagem baseada em protótipos?

Uma das maiores vantagens do Javascript é que ele é uma linguagem baseada em protótipos.

Mas o que significa que o Javascript é baseado em protótipos e por que isso é uma vantagem?

    A inheritance prototypal é uma forma de reutilização de código orientada a objects. O Javascript é uma das únicas linguagens orientadas a objects [mainstream] a usar a inheritance prototypal. Quase todas as outras linguagens orientadas a objects são clássicas.

    Na inheritance clássica , o programador escreve uma class, que define um object. Vários objects podem ser instanciados a partir da mesma class, então você tem código em um lugar que descreve vários objects em seu programa. As classs podem então ser organizadas em uma hierarquia, promovendo a reutilização de código. Um código mais geral é armazenado em uma class de nível mais alto, da qual as classs de nível mais baixo herdam. Isso significa que um object está compartilhando código com outros objects da mesma class, bem como com suas classs pai.

    Na forma de inheritance protótipo , os objects são herdados diretamente de outros objects. Todo o negócio sobre as aulas desaparece. Se você quiser um object, basta escrever um object. Mas a reutilização de código ainda é uma coisa valiosa, portanto, os objects podem ser vinculados em uma hierarquia. Em javascript, todo object possui um link secreto para o object que o criou, formando uma cadeia. Quando um object é solicitado por uma propriedade que ele não possui, seu object pai será solicitado … continuamente até a cadeia até que a propriedade seja encontrada ou até que o object raiz seja alcançado.

    Cada function em JavaScript (que são objects em si) na verdade tem um membro chamado “prototype”, que é responsável por fornecer valores quando um object é solicitado para eles. Ter esse membro permite que o mecanismo do construtor (pelo qual os objects são construídos a partir de funções) funcione. Adicionar uma propriedade ao protótipo de um object de function o tornará disponível para o object construído, bem como para todos os objects que herdarem dele.

    Vantagens

    Pode não haver uma regra rígida e rápida a respeito do motivo pelo qual a inheritance prototypal é uma forma vantajosa de reutilização de código. A reutilização de código em si é vantajosa e a inheritance prototípica é uma maneira sensata de lidar com isso. Você pode argumentar que a inheritance protótipo é um modelo bastante simples de reutilização de código, e que o código pode ser reutilizado de maneira direta . Mas as línguas clássicas certamente são capazes de realizar isso também.

    Sidenote: @Andrew Hedges faz um bom argumento, que na verdade existem muitas linguagens prototípicas. Vale a pena notar que esses outros existem, mas também vale a pena notar que nenhum deles é nada próximo do mainstream. NewtonScript pareceu ter alguma tração por um tempo, mas morreu com sua plataforma. Também é possível estender algumas linguagens modernas de maneiras que adicionam resources prototípicos.

    Uma linguagem baseada em protótipo, não faz distinção de classs versus objects: ela simplesmente possui objects. Uma linguagem baseada em protótipo tem a noção de um object prototípico, um object usado como modelo a partir do qual obter as propriedades iniciais de um novo object. Qualquer object pode especificar suas próprias propriedades, quando você o cria ou em tempo de execução. Além disso, qualquer object pode ser associado como o protótipo de outro object , permitindo que o segundo object compartilhe as propriedades do primeiro object.

    A programação baseada em protótipos é um estilo de programação orientada a objects em que as classs não estão presentes e a reutilização de comportamento (ou inheritance em linguagens baseadas em classs) é realizada pela clonagem de objects existentes que servem como protótipos.

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

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

    Em vez de declarar uma estrutura de classs, você pode criar objects do mesmo tipo e adicionar à sua definição sempre que quiser usar o protótipo do object. É mais flexível que o modo normal de fazer as coisas.

    Se você apenas usa objects em tempo de execução em vez de uma class na compilation para construir novos objects, isso abre a possibilidade de estender um object sem conhecer nenhum detalhe sobre ele. Claro, isso pode se tornar uma desvantagem rapidamente dependendo do uso. Eu não faço suposições sobre a linguagem aqui, por isso é aplicável a outras linguagens além de javascript que não são tão dinâmicas.

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

    Você pode pegar o object de qualquer lugar; seu próprio código, da rede, do database, da binding externa e assim por diante.

    Note que, uma linguagem não precisa implementar inheritance de protótipo como o javascript. Em javascript, um object de protótipo é meramente compartilhado, assim como suas propriedades, entre os herdeiros. A alternativa é copiar todas as propriedades do protótipo para o novo object. Cada abordagem tem seus pontos fortes em diferentes situações. Eu gosto do segundo mais, mas não é o que o JavaScript faz.

    Depois de ler todas as respostas, esta é a conclusão

    1) Herança em que objects são herdados diretamente de outros objects

    2) Isso não usa classs

    3) Também chamado de programação baseada em instância ou programação orientada a protótipo sem class

    4) A reutilização de comportamento é realizada clonando objects existentes que servem como protótipos

    5) O object usado como modelo do novo object obtém as propriedades iniciais