tipos prototipos orientado objetos modelo herencia ejemplos ejemplo desarrollo clases javascript oop class programming-languages selflanguage

javascript - prototipos - ¿Cuáles son las ventajas de que OO basado en prototipo tiene OO basado en clase?



prototype javascript ejemplos (7)

Creo que la diferencia está en el lenguaje de dinámica de potencia (prototipo) que se le da a usted. Javascript, al igual que LISP, le da un poder casi ilimitado a un programador. Este poder solo está limitado por la responsabilidad del programador y el nivel de confianza en sí mismo. Por lo tanto, la discusión es tan antigua como lo es, al igual que la tipificación estática y sin tipo. Si considera que su poder de programación y autodisciplina son lo suficientemente fuertes, elija un prototipo de estilo.

Parafraseando un dicho famoso:

El talento hace lo que puede (léase: basado en clases), el genio hace lo que quiere (léase: basado en prototipos).

¿Por qué el OO basado en clases es tan popular en lugar de OO basado en prototipos? ¿Enseñan esto último en las escuelas? Aunque Javascript se basa en prototipos, la mayoría de las personas lo usa principalmente funcionalmente, o a través de marcos que intentan emular un sistema basado en clases.

Sé que Sun ha investigado algo sobre sí Self . ¿Hay alguna otra fuente de conocimiento sobre prototipos basados ​​en oo? preferiblemente algo que es accesible para el autoaprendizaje.

Encontré un libro que contiene artículos publicados: Programación basada en prototipos: conceptos, idiomas y aplicaciones

¿Alguien lo ha leído?

-

Así que di la recompensa por la respuesta que más me dio. Aún así, no estoy realmente satisfecho. Me hubiera gustado escuchar muchas más respuestas técnicas. Tal vez no me explique bien.


Esta pregunta me intrigó, así que volví y leí algunos de los documentos originales sobre el concepto. Parece haber comenzado a mediados de la década de 1980 en el mundo Smalltalk, pero finalmente se convirtió en uno de los principios fundadores del Self . Mucho más tarde Javascript también lo adoptó.

El argumento expuesto en los documentos es que es más fácil de aprender. En realidad, no se propone ningún beneficio técnico aparte del aprendizaje. Todos los documentos explican que es tan expresivo como un lenguaje de clase, pero mucho más fácil de aprender. La gente naturalmente piensa sobre las cosas de una manera concreta en lugar de en abstracto. Pensamos en el elefante que vimos en el zoológico, no en un "elefante" genérico. Cuando vemos otros elefantes, los clasificamos como diferencias con respecto al primero. Un lenguaje basado en prototipos facilita este pensamiento. Piénselo como programación por diferencial.

¿Es eso una razón suficiente para usarlo en un idioma? Quizás. En los 25 años transcurridos desde que la idea comenzó a filtrarse, argumentaría que conceptos abstractos como OO basado en clases no han sido demasiado difíciles de aprender para la mayoría de la gente. Por otro lado, tal vez exista la necesidad de un lenguaje de programación de cuello azul (como Javascript) que sea más fácil y esta sea una forma de lograrlo.

Si está interesado, puede comenzar con este artículo sobre sí mismo.


La ventaja de la herencia prototípica es que potencialmente permite una metaprogramación sofisticada de una manera sencilla porque la cadena de prototipos se manipula fácilmente. Esta es una ventaja bastante académica porque la metaprogramación es la respuesta incorrecta el 99% del tiempo. Como ejemplo, podría tener una capa de manipulación de datos del estilo Javascript Key-Value Observer con una DSL especial que alterna de forma transparente entre un respaldo SQLite local cuando está fuera de línea y un servidor basado en REST cuando está en línea a través del intercambio de prototipos. No estoy seguro de que sea la mejor manera de hacer esto, pero es lo mejor que puedo hacer con este retraso. No es el tipo de cosas que generalmente quieres hacer en el código del proyecto, ya que este tipo de direccionamiento indirecto es difícil de depurar una vez que empiezas a hacerlo funcionar en varias capas, pero no está mal cuando lo guardas en una biblioteca.

Otra ventaja menos útil es que le permite diseñar su propio sistema de clases. Digo menos útil porque más o menos todas las bibliotecas javascript tienen su propio enfoque ligeramente incompatible sobre cómo se combinan las ''clases''.

Hay muchas personas que responden que mezclan el modelo de herencia con los idiomas implementados en ese modelo. El hecho de que javascript sea dinámico y débilmente tipado y, por lo tanto, difícil de usar, no tiene nada que ver con que sea un lenguaje prototípico.


No sé las razones exactas para esto, pero aquí están mis razones

Creo que este argumento es igual que Dinámico vs Estático, una clase es la definición estática del objeto, que se puede utilizar fácilmente para saber qué esperar de un objeto, también ayuda a las herramientas a los idiomas a tener soporte y documentación intellisense apropiados porque usted puede saber fácilmente cuáles son los diferentes miembros y métodos en el objeto, otra cosa es el diferente paradigma de tener la capacidad de declarar miembros privados en la clase que no se muestra en el objeto, esto no se puede hacer en el prototipo paradigma.

El prototipo de paradigma es agradable, sin embargo, carece de la capacidad de proporcionar información sobre los métodos y miembros en el objeto, lo que hace que las herramientas sean más difíciles, y también tiene más sentido para la programación de tipeo dinámico.


Realmente no quiero volver a escribir otro artículo sobre la herencia prototípica, así que lo vincularé a mis artículos anteriores. Eso sí, son realmente largos, pero vale la pena leerlos:

  1. Beneficios de herencia prototípica sobre clásica?
  2. Por qué la herencia prototípica es importante

Si está buscando a alguien que le señale las ventajas / desventajas de cada uno como explicación de su popularidad, creo que está cayendo en una falacia que, por alguna razón, es muy común en la tecnología, esa popularidad tiene algo que ver con algunos medida absoluta de calidad

La verdad es mucho más sosa: la OO basada en clase es popular porque Java usa OO clásico, y Sun gastó millones de dólares y durante mucho tiempo aumentó la popularidad de Java, asegurándose de que la gente sepa que se usa con éxito en las corporaciones, se enseña ampliamente en universidades , y en las pruebas AP de la escuela secundaria.

Prototypal / classical OO son simplemente diferentes formas de organizar tus ideas. Puede implementar cualquiera en idiomas que no lo admitan de forma nativa ( Python y Java vienen a la mente, y JavaScript en el otro lado).

En OO clásico, usted define una jerarquía abstracta de clases para sus objetos, y luego realmente trabaja con instancias de esas clases. En la herencia prototípica, crea una jerarquía de instancias de objetos. Aunque me imagino que podría ser un poco herético en ambos campos, no veo una razón por la que no puedas mezclar los dos ...