2008-10-09 14 views
207

Se dice que una de las principales ventajas de Javascript es que se trata de un lenguaje basado en prototipos.¿Qué significa que Javascript es un lenguaje basado en prototipos?

Pero, ¿qué significa que Javascript está basado en prototipos, y por qué es eso una ventaja?

+2

Esta respuesta explica todo lo que necesita saber sobre la herencia de prototypal: http://stackoverflow.com/a/16872315/783743 –

Respuesta

241

prototípico herencia es una forma de la reutilización de código orientado a objetos. Javascript es uno de los únicos lenguajes orientados a objetos [mainstream] para usar la herencia prototípica. Casi todos los otros lenguajes orientados a objetos son clásicos.

En herencia clásica, el programador escribe una clase, que define un objeto. Se pueden crear instancias de varios objetos de la misma clase, por lo que tiene un código en un lugar que describe varios objetos en su programa. Las clases pueden organizarse en una jerarquía, lo que favorece la reutilización del código. El código más general se almacena en una clase de nivel superior, de la cual heredan las clases de nivel inferior. Esto significa que un objeto comparte código con otros objetos de la misma clase, así como con sus clases principales.

En el herencia de prototipos forma, los objetos hereda directamente de otros objetos. Todo el negocio sobre las clases se va. Si quieres un objeto, simplemente escribe un objeto. Pero la reutilización de código sigue siendo una cosa valiosa, por lo que los objetos pueden vincularse entre sí en una jerarquía. En javascript, cada objeto tiene un enlace secreto al objeto que lo creó, formando una cadena. Cuando se le pide a un objeto una propiedad que no tiene, se le preguntará su objeto padre ... continuamente por la cadena hasta que se encuentre la propiedad o hasta que se llegue al objeto raíz.

Cada función en JavaScript (que son los objetos mismos) en realidad tiene un miembro llamado "prototipo", que es responsable de proporcionar los valores cuando se solicita un objeto para ellos. Tener este miembro permite que el mecanismo constructor (mediante el cual los objetos se construyen a partir de funciones) funcione. Agregar una propiedad al prototipo de un objeto de función lo hará disponible para el objeto construido, así como para todos los objetos que hereden de él.

Ventajas

Puede que no haya una regla dura y rápida en cuanto a porqué herencia de prototipos es una forma ventajosa de reutilización de códigos. La reutilización del código en sí es ventajosa, y la herencia prototípica es una forma sensata de resolverlo.Se podría argumentar que la herencia prototípica es bastante simple modelo de reutilización de código, y que el código puede ser muy reutilizado en formas directas. Pero los lenguajes clásicos ciertamente pueden lograr esto también.

Nota al margen:@ Andrew Coberturas hace un buen punto, que en realidad hay many idiomas prototípicos. Vale la pena señalar que estos otros existen, pero también vale la pena señalar que ninguno de ellos es algo cercano a la corriente principal. NewtonScript parecía tener algo de tracción durante un tiempo, pero murió con su plataforma. También es posible extender algunos idiomas modernos de forma que agreguen capacidades prototípicas.

+6

Hola Kelly. Mientras que JavaScript es ** por mucho ** el lenguaje prototípico más popular, hay muchos otros: http://en.wikipedia.org/wiki/Prototype-based_programming#Languages ​​ –

+1

Hola Andrew. Buen punto. Debería haber sido más claro. Voy a anotarlo. – keparo

+3

Lea también esto https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model – pramodc84

4

En lugar de declarar una estructura de clase, puede crear objetos del mismo tipo y agregarlos a su definición cada vez que desee utilizar el prototipo del objeto. Es más flexible que la forma normal de hacer las cosas.

45

Un lenguaje basado en prototipos, no hace la distinción de clases vs objetos: simplemente tiene objetos. Un lenguaje basado en prototipos tiene la noción de un objeto prototípico, un objeto utilizado como una plantilla a partir de la cual obtener las propiedades iniciales de un nuevo objeto. Cualquier objeto puede especificar sus propias propiedades, ya sea al crearlo o en tiempo de ejecución. Además, se puede asociar cualquier objeto como el prototipo de otro objeto, permitiendo que el segundo objeto comparta las propiedades del primer objeto.

+5

Una muy buena explicación, pero un poco engañosa con el comentario sobre la "plantilla de propiedades iniciales" .Si cambia el prototipo DESPUÉS de instanciar un objeto, ese objeto aún recibe esas funciones. – nickf

27

La programación basada en prototipos es un estilo de programación orientada a objetos donde las clases no están presentes y la reutilización del comportamiento (o la herencia en lenguajes basados ​​en clases) se realiza clonando objetos existentes que sirven como prototipos.

+0

¿Todavía te sientes de esta manera? Porque si es así, esta es la primera explicación que realmente solo hace un "clic" sólido conmigo. – Chazt3n

9

La ventaja/desventaja es que, podemos crear nuevos tipos de objetos en tiempo de ejecución sin necesidad de definir clases (código estático). Como la mayoría de las características, depende del desarrollador convertirlo en una ventaja/desventaja.

Arriba es posible porque los objetos son esencialmente funciones en el script java (también cierres).

+0

Los objetos dinámicos son un beneficio de javascript, pero no están realmente relacionados con JavaScript como lenguaje prototípico o funcional. En muchos idiomas clásicos, puede crear objetos dinámicos en tiempo de ejecución. Los cierres tampoco están relacionados. – keparo

+2

Las clases no son necesariamente un código estático; eche un vistazo a Python, en el que las clases son objetos en sí mismas, y están construidas a partir de metaclases que también son objetos. –

3

Si solo utiliza objetos en tiempo de ejecución en lugar de una clase en compilación para construir objetos nuevos, esto abre la posibilidad de extender un objeto sin conocer ningún detalle al respecto. Por supuesto, puede convertirse en una desventaja bastante rápido dependiendo del uso. No hago suposiciones sobre el idioma aquí, por lo que es aplicable a otros lenguajes además de javascript que no son tan dinámicos.

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

Puede obtener el objeto desde casi cualquier lugar; su propio código, desde la red, desde la base de datos, desde enlaces externos, etc.

Tenga en cuenta que, un idioma no tiene que implementar la herencia del prototipo como javascript. En javascript, un objeto prototipo simplemente se comparte, al igual que sus propiedades, entre los herederos. La alternativa es copiar todas las propiedades del prototipo al nuevo objeto. Cada enfoque tiene sus fortalezas en diferentes situaciones. Me gusta el segundo más, pero no es lo que hace javascript.

3

Después de leer todas las respuestas esta es la conclusión

1) Herencia en el que los objetos son heredados directamente de otros objetos

2) que no utiliza clases

3) También llamado Instancia basó Programación o programación orientada a prototipos sin clase

4) La reutilización del comportamiento se realiza mediante la clonación de objetos existentes que sirven como prototipos

5) Objeto utilizado como plantilla del nuevo objeto obtener propiedades iniciales

0

JavaScript is a prototype-based programming language (probablemente el lenguaje de scripting basado en prototipos es una definición más correcta). Emplea la clonación y no la herencia. Un lenguaje de programación basado en prototipos es un estilo de programación orientada a objetos que utiliza funciones como constructores de clases. Aunque Javascript tiene una clase de palabra clave, no tiene una declaración de clase. Esta distinción es importante cuando se compara JavaScript con otros lenguajes OOP.

Cuestiones relacionadas