En JavaScript, cada objeto es al mismo tiempo una instancia y una clase. Para hacer la herencia, puede usar cualquier instancia de objeto como prototipo.
En Python, C ++, etc. hay clases e instancias, como conceptos separados. Para hacer la herencia, debe usar la clase base para crear una nueva clase, que luego puede usarse para producir instancias derivadas.
¿Por qué JavaScript se dirigió en esta dirección (orientación a objetos basada en prototipos)? ¿Cuáles son las ventajas (y desventajas) de la OO basada en prototipos con respecto a la OO tradicional basada en clases?
javascript
oop
inheritance
prototype-programming
Stefano Borini
fuente
fuente
GEB
?Respuestas:
Aquí hay alrededor de un centenar de problemas de terminología, en su mayoría basados en alguien (no usted) que intenta hacer que su idea suene como La mejor.
Todos los lenguajes orientados a objetos deben ser capaces de manejar varios conceptos:
Ahora, en cuanto a la comparación:
Lo primero es toda la pregunta "clase" vs "prototipo". La idea comenzó originalmente en Simula, donde con un método basado en clases cada clase representaba un conjunto de objetos que compartían el mismo espacio de estado (leídos "valores posibles") y las mismas operaciones, formando así una clase de equivalencia. Si mira hacia atrás a Smalltalk, dado que puede abrir una clase y agregar métodos, esto es efectivamente lo mismo que puede hacer en Javascript.
Los lenguajes OO posteriores querían poder usar la comprobación de tipo estático, por lo que obtuvimos la noción de un conjunto de clases fijo en tiempo de compilación. En la versión de clase abierta, tenías más flexibilidad; en la versión más reciente, tenía la capacidad de verificar algunos tipos de corrección en el compilador que de lo contrario habrían requerido pruebas.
En un lenguaje "basado en clases", esa copia ocurre en tiempo de compilación. En un lenguaje prototipo, las operaciones se almacenan en la estructura de datos prototipo, que se copia y modifica en tiempo de ejecución. Sin embargo, en resumen, una clase sigue siendo la clase de equivalencia de todos los objetos que comparten el mismo espacio de estado y métodos. Cuando agrega un método al prototipo, efectivamente está haciendo un elemento de una nueva clase de equivalencia.
Ahora, ¿por qué haces eso? principalmente porque crea un mecanismo simple, lógico y elegante en tiempo de ejecución. ahora, para crear un nuevo objeto, o para crear una nueva clase, simplemente tiene que realizar una copia profunda, copiando todos los datos y la estructura de datos prototipo. Entonces obtienes herencia y polimorfismo más o menos de forma gratuita: la búsqueda de métodos siempre consiste en pedirle al diccionario la implementación de un método por nombre.
La razón que terminó en el script Javascript / ECMA es básicamente que cuando comenzamos con esto hace 10 años, estábamos lidiando con computadoras mucho menos potentes y navegadores mucho menos sofisticados. Elegir el método basado en el prototipo significaba que el intérprete podría ser muy simple y al mismo tiempo preservar las propiedades deseables de la orientación a objetos.
fuente
Una comparación, que está ligeramente sesgada hacia el enfoque basado en prototipos, se puede encontrar en el artículo Self: The Power of Simplicity . El documento presenta los siguientes argumentos a favor de los prototipos:
Self es probablemente el primer idioma en implementar prototipos (también fue pionero en otras tecnologías interesantes como JIT, que más tarde llegó a la JVM), por lo que leer los otros documentos de Self también debería ser instructivo.
fuente
point
es una instancia de clasePoint
, que es una instancia de metaclasestandard-class
, que es una instancia de sí misma, ad finitum.Deberías ver un gran libro en JavaScript de Douglas Crockford . Proporciona una muy buena explicación de algunas de las decisiones de diseño tomadas por los creadores de JavaScript.
Uno de los aspectos de diseño importantes de JavaScript es su sistema de herencia de prototipos. Los objetos son ciudadanos de primera clase en JavaScript, tanto que las funciones regulares también se implementan como objetos (el objeto 'Función' para ser precisos). En mi opinión, cuando se diseñó originalmente para ejecutarse dentro de un navegador, estaba destinado a usarse para crear muchos objetos únicos. En el navegador DOM, encontrará esa ventana, documento, etc., todos los objetos únicos. Además, JavaScript es un lenguaje dinámico tipado libremente (a diferencia de Python, que es fuertemente tipado, lenguaje dinámico), como resultado, se implementó un concepto de extensión de objeto mediante el uso de la propiedad 'prototipo'.
Así que creo que hay algunas ventajas para la OO basada en prototipos implementada en JavaScript:
Estas son algunas de las desventajas del prototipo OO:
fuente