Steve Yegge publicó recientemente un interesting blog post en lo que él llama el patrón de diseño universal. Allí detalla el uso de prototipos como una herramienta de modelado, en lugar de clases. Me gusta la forma en que esto introduce menos acoplamiento en comparación con la herencia. Pero eso es algo que también se puede obtener con las clases, al implementar las clases en términos de otras clases, en lugar de la herencia. ¿Alguien más tiene historias exitosas sobre el uso de prototipos y puede ayudar a explicar dónde es ventajoso usar prototipos en comparación con las clases? Supongo que se trata de modelado estático versus modelado dinámico, pero serían bienvenidos más ejemplos.prototipos versus clases
Respuesta
Un aspecto interesante es que es fácil hacer que un lenguaje basado en prototipos actúe como OO pero es difícil hacer que un lenguaje OO actúe basado en prototipos. de
- Alex Arnell inheritance.js es un pedazo corto y dulce de código JavaScript que hace acto OO, con acceso a los padres 'Clase'.
- He aquí una de las soluciones de John Resig para el mismo problema: http://ejohn.org/blog/simple-javascript-inheritance/.
- Chapter 16 of Programming in Lua describe la orientación de objetos en Lua. Específicamente, section 16.2 ofrece un buen ejemplo de herencia.
No está del todo claro cómo se vería OO como prototipo, aparte de la composición frente a la herencia como usted menciona.
Un lenguaje de prototipos facilita el comportamiento complejo de herencia. Puede implementar el comportamiento de multiple inheritance, mixin, o simplemente seleccionar y elegir lo que quiere de un objeto para agregarlo a otro.
Wikipedia's article menciona: "Los defensores de la programación basada en prototipos a menudo argumentan que los lenguajes basados en clases fomentan un modelo de desarrollo que se enfoca primero en la taxonomía y las relaciones entre clases.En contraste, la programación basada en prototipos se considera alentadora para el programador centrarse en el comportamiento de un conjunto de ejemplos y luego preocuparse por clasificar estos objetos en objetos arquetípicos que luego se utilizan de forma similar a las clases ".
Eso no quiere decir que el prototipo de paradigma es todo ventajas y nada contra. Si OO es más restrictivo, es porque elige serlo. Puedo ver dónde toda esa flexibilidad podría meterlo en problemas si no tiene cuidado.
Los prototipos son una forma de herencia, es solo que los objetos heredan atributos y comportamientos directamente de otros objetos, en lugar de obtener sus atributos y el comportamiento de su clase, que hereda de otras clases.
Por ejemplo, consulte cualquier código orientado a objetos en un prototype based language como, por ejemplo, JavaScript.
lo tienes al revés: programación orientada a objetos la herencia basada en la clase es un subconjunto de prototipos (que es un subconjunto de la tipificación de pato) – Javier
creo que malinterpreta yo. Estaba diciendo que los prototipos son una forma de herencia y las clases/subclases son otra forma. No estaba tratando de entrar en la pregunta completa "cuál se puede implementar en términos de la otra". – Glomek
Para los interesados, NewtonScript era (es) un idioma dual: tenías prototipos y tenías clases. Puede elegir heredar de una clase, de un prototipo o de ambos.
- 1. Estructuras versus clases
- 2. Lenguaje basado en prototipos
- 3. pymssql versus pyodbc versus adodbapi versus ...
- 4. ¿Qué son prototipos en JavaScript?
- 5. Prototipos en JavaScript
- 6. constructores S4 y prototipos
- 7. prototipos para funciones "estáticas"
- 8. Prototipos de clase
- 9. _Expand versus new versus GNU
- 10. Control.ResolveUrl versus Control.ResolveClientUrl versus VirtualPathUtility.ToAbsolute
- 11. metaphone versus soundex versus NYSIIS
- 12. OOP: basado en clases y basado en prototipos, ¿hay otras alternativas?
- 13. Prototipos nativos frente a $ .extension()
- 14. JavaScript herencia funcional con prototipos
- 15. Propósito de C/C Prototipos ++
- 16. Variables privadas en prototipos heredados
- 17. Python __str__ versus __unicode__
- 18. zend-framework versus Kohana versus Symfony
- 19. @XMLRootElement versus @XmlType
- 20. $ versus jQuery
- 21. ¿Python tiene prototipos de clase (o declaraciones avanzadas)?
- 22. Cómo encadenar funciones sin usar prototipos?
- 23. ctags prototipos de función C multilínea
- 24. JQuery-equivalente a prototipos Down() - función
- 25. Extracción de C/C++ prototipos de funciones
- 26. Creación de prototipos para Amazon Ec2
- 27. Creación de prototipos Qt/C++ en Python
- 28. ¿Los prototipos son malos en JavaScript?
- 29. funciones Instantiate JavaScript con prototipos personalizados
- 30. objetos no heredan las funciones de prototipos
semánticamente, prototipos + delegación == + clases herencia –
errata: Yeggie debe ser Yegge – Ken