¿Por qué JavaScript no permanece puro para el paradigma prototipo sino que introduce una sintaxis especial para las clases?

Se mantienen “puros” para el paradigma prototipo, que es fundamental para JavaScript. Introdujeron una sintaxis especial para las clases por varias razones y enumeraré algunas de ellas a continuación. Pero primero quiero enfatizar que la sintaxis de la clase no es más que azúcar sintáctica para la forma estándar de hacer clases en JavaScript. Aquí hay un ejemplo rápido de cómo hacer clases y herencia en JavaScript, a la antigua usanza:

  Programador de funciones ()
 { 
	 this.type = 'genérico'; 
 }

 Programmer.prototype.write_code = function () { 
	 this.waits = 'mucho tiempo'; 
 };

 función JavaScriptProgrammer () 
 { 
	 this.type = 'específico';
 }

 JavaScriptProgrammer.prototype = new Programmer ();
 JavaScriptProgrammer.prototype.constructor = JavaScriptProgrammer;

 JavaScriptProgrammer.prototype.write_code = function () {
	 this.waits = 'poco tiempo';
 };

 let p = new Programmer (),
  j = nuevo JavaScriptProgrammer ();

 p.write_code ();
 j.write_code ();

 console.log (`tipo p: $ {p.type}, p espera: $ {p.waits}`);
 console.log (`j tipo: $ {j.type}, j espera: $ {j.waits}`);
 // tipo p: genérico, p espera: mucho tiempo
 // tipo j: específico, j espera: poco tiempo

O algo por el estilo, no he hecho esto por un tiempo. Si bien esto es extremadamente poderoso, no es exactamente intuitivo, obvio o particularmente legible.

La nueva sintaxis de clase le permite hacer exactamente lo mismo, excepto que ahora es legible y clara:

  Programador de clase
 {
	 constructor()
	 {
		 this.type = 'genérico';
	 }

	 write_code ()
	 {
		 this.waits = 'mucho tiempo';
	 }
 }

 clase JavaScriptProgrammer extiende Programador
 {
	 constructor()
	 {
		 súper();
		 this.type = 'específico';
	 }

	 write_code ()
	 {
		 this.waits = 'poco tiempo';
	 }
 }

Sin comparación. Y, sin embargo, puede usar ambos, y son casi idénticos detrás de escena.

  typeof Programmer === 'function' // true

No “clase” como podría haber esperado.

Algunas de las razones por las que agregaron esto son buenas, legibilidad, como se muestra arriba. También es una sintaxis que es mucho más común y que los nuevos programadores o programadores de otros idiomas aprenden y entienden más fácilmente. La sintaxis también ilustra más claramente qué métodos pertenecen a una clase (o prototipo de función). Las funciones estáticas son más claras debido a la nueva palabra clave static . Y muchas más razones.

El comité TC39, que es el grupo que controla JavaScript, está haciendo un buen trabajo agregando nuevas características que son sólidas y claras, y aún conserva el paradigma del lenguaje. Lo que no pueden hacer, y desearían poder hacerlo, es cambiar JavaScript. Solo pueden agregar, no cambiar. Si cambian algo, incluso una pequeña cosa, literalmente, de hecho, “romperán Internet”.

Entonces, la respuesta específica a su pregunta es: JavaScript se mantiene fiel al paradigma prototipo y agrega nueva sintaxis para las clases.

Puedes tener tu pastel y comértelo también.

Esto no va a ser más una conjetura basada en mi experiencia que la respuesta, pero me gustaría hablar desde mi propia experiencia. Espero que se agregue a otras mejores respuestas.

He programado OO en clase durante buena parte de mi carrera desde C ++, C # a Java. Mi patrón de pensamientos ha estado tan conectado a pensar en términos de clases que he evitado casi inconscientemente desaprender.

Nos hemos acostumbrado a la tipificación estática y los sistemas de clase estáticos. Algunas personas piensan que alterar el comportamiento de los objetos mientras lo ejecutas será absurdo y totalmente impredecible y peligroso.

Lo mismo ocurre con la programación funcional … En algunos campamentos, dicen evitar OO y centrarse más en el diseño de composición funcional en JavaScript porque en realidad fue diseñado para usarse de esa manera en primer lugar.

Dado que esto me ha sucedido, creo que hay otras 100,000 personas que han estado haciendo algún tipo de programación empresarial en grandes grupos con una mentalidad similar, y si hay suficientes, algunos de ellos intentarán hacer algún movimiento político. comités para cambiar las cosas a su manera.

Mirando hacia atrás, si alguien me hubiera dicho que simplemente desechara toda mi noción preconcebida de lo que debería ser el lenguaje de programación JS, y si hubiera aceptado JavaScript desde una perspectiva completamente clara, habría sido un mucho más exitoso con él antes. Quizás, la comunidad JS podría haber hecho campaña y comercializado mejor en el departamento de propuesta de valor.

Porque lo único que intenta resolver el paradigma prototipo es la falta de clases explícitas. En consecuencia, el problema con el paradigma prototipo es que te obliga a hablar sobre clases que usan el mismo lenguaje que usas para otras cosas, lo que introduce la posibilidad de confusión.

La triste verdad sobre JavaScript es que, en lugar de permitirte hacer algunas cosas, te obliga a fingir que estás haciendo esas cosas.

Por ejemplo, creé una aplicación bastante sofisticada en JavaScript y, para mayor claridad, terminé haciéndolo así:

  // tenga en cuenta que la mayoría de los valores iniciales (excepto los métodos) son simplemente 
 // marcadores de posición que llevan más información que un "nulo"
 // valor y son reemplazados por el constructor
     escena: TRES. Escena,
     cámara: TRES. Cámara,
     procesador: TRES.WebGLRenderer,
     controles: TRES.Controles de órbita,
     Raycaster: TRES. Raycaster,
     mouse: THREE.Vector2,
     nodos: {
	 geometría: TRES Geometría,
	 material: TRES.Material,
	 malla: TRES. Malla,
	 coordenadas: [[Número, Número, Número]],
	 seleccionado: {},
	 descripciones: matriz
     },
     fondo: {
	 geometría: TRES Geometría,
	 material: TRES.Material,
	 malla: TRES Malla
     },
     rutas: {
	 geometrías: [], // [TRES.Geometría],
	 materiales: [], // [TRES.Material],
	 mallas: [], //[THREE.Mesh],
	 tabla: matriz, // enlaces
	 actual: [], // [TRES.Malla]
     },

Honestamente, no hay virtud en no poder expresar algo.

Además de todo, presumiblemente respuestas correctas (TL; TR: Esto es Syntax Sugar), esto ofrece una sintaxis más clara ‘extiende fn ()’ para configurar la cadena prototipo. Me sorprendió lo que hace ese ágil ayudante de sintaxis. Sin embargo, todos los viejos restos de ‘habrá dragones’.
Entonces, después de un tiempo, terminé con construcciones simples de nuevo, pero estoy feliz de tener algo que aclarar “esto es un objeto / clase” desde el principio.

Para detener el suministro interminable de bibliotecas JS que proporcionan aproximaciones a las clases, liberando a la mitad de los desarrolladores del mundo para que finalmente hagan algo productivo con su tiempo 🙂

Pero, en serio: no es como si las implementaciones JS existentes hicieran prototipos particularmente bien: el beneficio de la herencia prototípica es que los objetos pueden cambiar su prototipo en tiempo de ejecución, pero intente eso en un navegador y obtendrá una gran advertencia de que acaba de arruinar el rendimiento de su aplicación (no, su código no se volverá a compilar; ahora es oficialmente un niño / niña malo y el optimizador nunca lo volverá a mirar).

Debido a que el paradigma OO de estilo Java y C ++ es bien entendido por la mayoría de las personas y, francamente, no creo que la herencia prototípica proporcione abstracciones innovadoras por encima de eso.

ES6 y TypeScript se parecen bastante a cualquier lenguaje OO moderno en su implementación de especificación de clases. Obviamente, el modelo de objeto subyacente es prototípico, pero puede hacer su herencia básica y polimorfismo, que es lo que la mayoría de la gente quiere de OO.

Porque esa es la forma en que los desarrolladores de la comunidad se están moviendo.

JavaScript es un lenguaje muy dinámico en muchos sentidos, tanto en la forma en que lo escribes como en las especificaciones de la comunidad / lenguaje. Recientemente ha habido muchas mejoras y sugerencias para JavaScript que permitirán a los desarrolladores escribir lo que quieren escribir de manera más efectiva.

Las clases son algo que a algunos desarrolladores de JavaScript les gustaría poder usar. Ya están implementados en el pensamiento del desarrollador, pero actualmente depende del desarrollador traducir y administrar todas las clases en su cabeza, y escribir código sin ellas. No es fácil, por lo que el idioma está cambiando para adaptarse a eso.

Porque JS es administrado por un grupo de personas que piensan gravemente diferente. No hay absolutamente ninguna necesidad de clases en el tejido de JS, sin embargo, las clases se agregan solo para hacer que JS se parezca a otros lenguajes OOP que no tienen abstracción prototípica. Esto convierte a JS en un lenguaje esquizofrénico. A partir de hoy, dos mismos códigos JS que hacen exactamente lo mismo se asemejan a dos idiomas separados.

Para aumentar el acceso y reducir las barreras de entrada para las personas que tienen experiencia en idiomas que usan la herencia clásica.

More Interesting

¿Cómo preserva los créditos de SEO de un sitio web existente cuando lo rediseña en WordPress? Estoy construyendo un nuevo sitio ahora y reemplazaré el antiguo con él, por lo que no quiero instalarlo y, de repente, el negocio cae del mapa de SEO.

¿Cuáles son las ventajas y desventajas de Bootstrap y WordPress? ¿Cuál debería aprender?

¿Por qué prefieres Aurelia sobre Angular?

¿Dónde está el mejor curso web para PHP?

¿Qué marco MVC principal (en cualquier idioma) tiene la arquitectura más intuitiva?

¿Cuáles son algunos proyectos "bootstrap" o "kickstart" de aplicaciones web Java?

Cómo optimizar el sitio web de WordPress

¿Cuál es el alcance del desarrollo web en el futuro?

¿Cómo puedo perfeccionar mis habilidades de JavaScript (JQuery) sin invertir demasiado tiempo en diseño HTML y CSS?

¿Puedes crear una página de aterrizaje personal en WordPress?

Cómo crear un sitio web donde las personas llenen algunos cuadros de texto y el contenido de estos cuadros de texto se combine por correo en uno o más documentos de Word

¿Cuáles son algunas buenas compañías en India que usan Node.js para sus servidores?

¿Qué tecnologías o lenguajes de programación están surgiendo? Por ejemplo, Node.js, Python, Ruby.

PHP (lenguaje de programación): ¿Qué habilidades técnicas (o conocimientos) a menudo se pasan por alto que todo desarrollador de PHP debería tener?

¿Por qué debería aprender Ruby on Rails? ¿Qué tan difícil es para un programador de Java aprender Ruby? ¿Cuáles son las ventajas frente a otros marcos de desarrollo web?