2010-01-19 13 views
13

Hay muchos artículos y publicaciones que explican cómo funciona la herencia de JavaScript, pero ¿por qué se implementó JavaScript usando la herencia de prototipos en lugar de la herencia clásica?¿Por qué se implementó JavaScript usando herencia de prototipos?

Me encanta JavaScript, así que no digo que sea malo ... solo tengo curiosidad.

+7

marque como wiki de la comunidad por favor .. –

+0

¿Es el creador de JavaScript un usuario de Stackoverflow? –

+1

@Gaby - Hay una respuesta en algún lado. – ChaosPandion

Respuesta

1

Creo que fue elegido porque es fácil de implementar, no necesita palabras clave adicionales y los usuarios no necesitan entenderlo para poder usar el idioma. También es más potente y flexible que la herencia basada en la clase.

Es una elección natural para un lenguaje sin tipo. Las principales ventajas de la herencia basada en clases son que permite el tipado estático y, por lo tanto, la comprobación de tipos y una implementación más rápida de búsqueda basada en tablas.

+0

Me pregunto sobre el argumento "fácil de implementar". Si bien esto puede ser correcto con respecto a la herencia de objetos, no parece ser cierto cuando se considera que las funciones de primera clase de JavaScript son realmente poderosas y, en mi opinión, no son tan sencillas de implementar (aplicaciones parciales, cierres, etc.). – stakx

12

A menos que uno de los diseñadores de JavaScript se detenga para opinar, solo podemos especular. Dicho esto, aquí está mi opinión:

JavaScript se ejecuta tal como se interpreta, por lo que no existe el concepto de separar la declaración del tipo de un objeto del propio objeto. Es un enfoque muy funcional. La instancia está surgiendo a medida que se describe: siempre estamos operando en instancias activas. Debido a esto, el concepto de una clase, o una "plantilla de instancia" pasiva, no tiene lugar real.

+4

Hay muchos lenguajes de scripts que usan clases. –

+0

Esto tiene tanta sustancia como decir que es prototípico porque es prototípico. No es que lo estés diciendo, pero la conclusión es absurda. –

+0

@SeanMcMillan cierto, no era mi intención implicar que el lenguaje * debe * funcionar de esta manera porque es un lenguaje de scripting, sino que es bastante conveniente. –

8

Se suponía que JavaScript se parecía mucho a Lisp. Incluso después de que la sintaxis se cambió para parecerse más a C/Java, sigue siendo Lisp in C's clothing. Creo que la respuesta está en sus orígenes funcionales de programación. En FP puro, no hay estado mutable, lo que significa que no hay objetos mutables. Si relajas las reglas un poco y te vuelves un poco creativo, terminas con algo así como la herencia protípal, es decir, puedes extender objetos pero no modificar el objeto original. Proporciona el mismo poder que la herencia y aún te da algo de inmutabilidad.

Finalmente, gire el idioma para que se vea como C++ y Java, y viola, tiene new someFunction() y el resto es historial.

+1

¿Qué quiere decir con "no hay estado mutable, lo que significa que no hay objetos mutables"? –

+0

@Andre: en la programación funcional ** pura ** (como Erlang por ejemplo) todas las variables son constantes. Los valores que tienen no se pueden modificar después de crear una instancia de la variable. Como nos referimos a objetos que usan variables, eso significa que los objetos en FP puro no se pueden modificar: todos los objetos son constantes. – slebetman

+0

Bien, pero en javascript, ¿qué sucede si hago esto? Var a = {name = "n", age = 1}. a.age = 2. ¿Qué estoy haciendo? volver a instanciar 'a'? –

1

La herencia prototípica (con cierres) permite a los demás hacer cosas que nunca se imaginaron. Es el engranaje de varios paradigmas que se han unido para lograr una programación de propósito general.

Con un lenguaje prototipo, puede tener "mezclas" para sus clases. Puede lograr el nivel de encapsulación que desee sin palabras clave específicas del idioma. En resumen, los prototipos de idiomas son impresionantes.

Odio decirlo, pero JavaScript, además de algunas bibliotecas, puede hacer todo lo que necesito. Era subversivo en su desarrollo (se suponía que era subordinado a Java). Tiene mucho poder, en la más simple de las implementaciones.

Con suficiente estudio/jugando, comenzará a ver las ventajas de su inspiración. JavaScript es uno de los pocos idiomas que "oculta" intencionalmente su potencial. Tienes que entrar en la política si quieres saber el "por qué". Pero, es por esta razón, que es increíble.

+0

@Pestilence, ¿me puede indicar algunos recursos para "hacer cosas que nunca se imaginaron"? Por ejemplo, con mix-ins, puedo obtener los métodos de un objeto estableciendo mi prototipo, pero solo puedo hacerlo una vez, ¿no? A menos que haga algo sin necesitar prototipos como: - Tengo un objeto X, quiero que posea Y.doAlgo - X.doAlgo = Y.aAlgo - (eso solo hace una referencia a Y.hacerAlgo, correcto "¿Qué pasa si quiero tenerlo de forma independiente?" – ambertch

+0

Bueno, emular la herencia de clase es una cosa que puedes hacer ... Pero no necesitas preocuparte por las jerarquías en un lenguaje de tipado dinámico. Simplemente clone uno o más de sus prototipos en una nueva instancia. Lo que puede hacer, incluir: crear dinámicamente "clases" e instancias mediante métodos de mezcla e inicializadores de otras "clases". Alterar mediante programación la interfaz durante "construcción". Incluso cambiar las "clases" base. La modificación de todos los objetos de cadena para incluir los métodos de Base64 es algo que me gusta hacer: "foo" .base64(). – pestilence669

+0

El atributo de prototipo al que se refiere es, se puede considerar opcional, para clases personalizadas. Puede tomar el control y evitarlo por completo. – pestilence669

5

Porque estaba muy influenciado por Self. Tanto Wikipedia como la especificación de ECMA lo mencionan.

15

Esto es lo que Brendan Eich tiene que decir acerca de lo sucedido: http://weblogs.mozillazine.org/roadmap/archives/2008/04/popularity.html

Como he dicho a menudo, y como otros en Netscape pueden confirmar, que fue reclutado a Netscape con la promesa de "Esquema haciendo "en el navegador. Al menos la gerencia de ingeniería de clientes, incluyendo Tom Paquin, Michael Toy y Rick Schell, junto con un tipo llamado Marc Andreessen, estaban convencidos de que Netscape debería incorporar un lenguaje de programación, en forma de fuente, en HTML.

El diktat de la gerencia superior de ingeniería era que el lenguaje debe "parecerse a Java". Eso descartó a Perl, Python y Tcl, junto con Scheme.

No estoy orgulloso, pero estoy contento de haber escogido las funciones de primera clase Scheme-ish y los prototipos Self-ish (aunque sean singulares) como ingredientes principales. Las influencias de Java, especialmente los errores de fecha y2k, pero también la distinción entre objeto primitivo y contra objeto (por ejemplo, cadena frente a cadena), fueron desafortunadas.

Cuestiones relacionadas