Prefiero usar OOP en proyectos a gran escala como el que estoy trabajando en este momento. Necesito crear varias clases en JavaScript pero, si no me equivoco, hay al menos un par de formas de hacerlo. ¿Cuál sería la sintaxis y por qué se haría de esa manera?
Me gustaría evitar el uso de bibliotecas de terceros, al menos al principio.
Buscando otras respuestas, encontré el artículo Programación orientada a objetos con JavaScript, Parte I: Herencia - Doc JavaScript que analiza la programación orientada a objetos en JavaScript. ¿Hay una mejor manera de hacer la herencia?
javascript
oop
class
Karim
fuente
fuente
Respuestas:
Aquí está la forma de hacerlo sin usar ninguna biblioteca externa:
Ahora la respuesta real es mucho más compleja que eso. Por ejemplo, no existen las clases en JavaScript. JavaScript utiliza un
prototype
esquema de herencia basado en.Además, existen numerosas bibliotecas populares de JavaScript que tienen su propio estilo de aproximación a la funcionalidad de clase en JavaScript. Querrás ver al menos Prototype y jQuery .
Decidir cuál de estos es el "mejor" es una excelente manera de comenzar una guerra santa en Stack Overflow. Si te embarcas en un proyecto más grande con mucho JavaScript, definitivamente vale la pena aprender una biblioteca popular y hacerlo a su manera. Soy un prototipo, pero Stack Overflow parece inclinarse hacia jQuery.
En la medida en que solo haya "una forma de hacerlo", sin ninguna dependencia de bibliotecas externas, la forma en que escribí es más o menos eso.
fuente
La mejor manera de definir una clase en JavaScript es no definir una clase.
Seriamente.
Hay varios sabores diferentes de orientación a objetos, algunos de ellos son:
Y probablemente otros que no conozco.
JavaScript implementa OO basado en prototipos. En OO basado en prototipos, los nuevos objetos se crean copiando otros objetos (en lugar de crear una instancia de una plantilla de clase) y los métodos viven directamente en objetos en lugar de en clases. La herencia se realiza por delegación: si un objeto no tiene un método o propiedad, se busca en sus prototipos (es decir, el objeto del que se clonó), luego los prototipos del prototipo y así sucesivamente.
En otras palabras: no hay clases.
JavaScript en realidad tiene un buen ajuste de ese modelo: constructores. No solo puede crear objetos copiando los existentes, sino que también puede construirlos "de la nada", por así decirlo. Si llama a una función con la
new
palabra clave, esa función se convierte en un constructor y lathis
palabra clave no apuntará al objeto actual sino a uno recién creado "vacío". Por lo tanto, puede configurar un objeto de la forma que desee. De esa manera, los constructores de JavaScript pueden asumir uno de los roles de las clases en OO tradicional basado en clases: servir como plantilla o modelo para nuevos objetos.Ahora, JavaScript es un lenguaje muy poderoso, por lo que es bastante fácil implementar un sistema OO basado en clases dentro de JavaScript si lo desea. Sin embargo, solo debe hacer esto si realmente lo necesita y no solo porque así es como lo hace Java.
fuente
Clases ES2015
En la especificación ES2015, puede usar la sintaxis de clase que es solo azúcar sobre el sistema prototipo.
Beneficios
El principal beneficio es que las herramientas de análisis estático encuentran más fácil orientar esta sintaxis. También es más fácil para otros que vienen de lenguajes basados en clases usar el lenguaje como políglota.
Advertencias
Tenga cuidado con sus limitaciones actuales. Para lograr propiedades privadas, uno debe recurrir al uso de símbolos o mapas débiles . En futuras versiones, las clases probablemente se ampliarán para incluir estas características faltantes.
Apoyo
La compatibilidad con el navegador no es muy buena en este momento (es compatible con casi todos excepto IE), pero ahora puede usar estas funciones con un transpilador como Babel .
Recursos
fuente
Prefiero usar Daniel X. Moore's
{SUPER: SYSTEM}
. Esta es una disciplina que proporciona beneficios tales como variables de instancia verdaderas, herencia basada en rasgos, jerarquías de clases y opciones de configuración. El siguiente ejemplo ilustra el uso de variables de instancia verdaderas, que creo que es la mayor ventaja. Si no necesita variables de instancia y está satisfecho con solo variables públicas o privadas, entonces probablemente haya sistemas más simples.Wow, eso no es realmente muy útil por sí solo, pero mira agregar una subclase:
Otra ventaja es la capacidad de tener módulos y herencia basada en rasgos.
Un ejemplo de tener la clase de persona incluye el módulo enlazable.
Divulgación: Soy Daniel X. Moore y este es mi
{SUPER: SYSTEM}
. Es la mejor manera de definir una clase en JavaScript.fuente
fuente
Las siguientes son las formas de crear objetos en JavaScript, que he usado hasta ahora
Ejemplo 1:
Ejemplo 2
Ejemplo 3
Ejemplo 4: Beneficios reales de Object.create (). por favor consulte [este enlace]
Ejemplo 5 (Crockford's Object.create personalizado):
Para mantener la respuesta actualizada con ES6 / ES2015
Una clase se define así:
fuente
Creo que deberías leer la herencia prototípica de Douglas Crockford en JavaScript y la herencia clásica en JavaScript .
Ejemplos de su página:
¿Efecto? Te permitirá agregar métodos de una manera más elegante:
También recomiendo sus videos: JavaScript avanzado .
Puede encontrar más videos en su página: http://javascript.crockford.com/ En el libro de John Reisig puede encontrar muchos ejemplos del sitio web de Douglas Crockfor.
fuente
'strings'
Debido a que no admitiré el plan de fábrica de YUI / Crockford y porque me gusta mantener las cosas autónomas y extensibles, esta es mi variación:
donde idealmente el tipo de prueba está en algo como el primer método prototipo
fuente
Si lo que busca es simple, puede evitar la palabra clave "nueva" por completo y simplemente usar métodos de fábrica. Prefiero esto, a veces, porque me gusta usar JSON para crear objetos.
Sin embargo, no estoy seguro de cuál es el rendimiento para los objetos grandes.
fuente
Esa es la forma en que TypeScript compila la clase con el constructor a JavaScript.
fuente
La forma simple es:
El motivo
that
es quethis
puede vincularse a otra cosa si le da un método como controlador de eventos, por lo que guarda el valor durante la creación de instancias y lo usa más tarde.Editar: definitivamente no es la mejor manera, solo una manera simple. ¡Estoy esperando buenas respuestas también!
fuente
Probablemente desee crear un tipo utilizando el Patrón de plegado:
Ese código le dará un tipo llamado myType . Tendrá campos privados internos llamados alternar y texto . También tendrá estos miembros expuestos: los campos cuenta y números ; las propiedades alternar , texto y númeroLongitud ; los métodos incrementanNumbersByCount y ajustan .
El patrón de plegado se detalla aquí: Patrón de plegado de Javascript
fuente
Codifique golf para la respuesta de @ liammclennan .
fuente
MooTools (My Object Oriented Tools) se centra en la idea de clases . Incluso puede extender e implementar con herencia.
Cuando se domina, se convierte en javascript ridículamente reutilizable y potente.
fuente
Clases basadas en objetos con herencia
Sencillo, dulce y listo.
fuente
Una base
Una clase
Acción
fuente
Basado en el ejemplo de Triptych, esto podría ser incluso más simple:
Esto solo crea una instancia de objeto único, pero sigue siendo útil si desea encapsular un montón de nombres para variables y métodos en una clase. Normalmente no habría argumentos "Bob, M" para el constructor, por ejemplo, si los métodos fueran llamadas a un sistema con sus propios datos, como una base de datos o una red.
Todavía soy demasiado nuevo con JS para ver por qué esto no usa la
prototype
cosa.fuente
JavaScript está orientado a objetos , pero es radicalmente diferente a otros lenguajes OOP como Java, C # o C ++. No trates de entenderlo así. Tire ese viejo conocimiento y comience de nuevo. JavaScript necesita un pensamiento diferente.
Sugeriría obtener un buen manual o algo sobre el tema.
Yo mismo encontré los Tutoriales ExtJS los mejores para mí, aunque no he usado el marco antes o después de leerlo. Pero da una buena explicación sobre qué es qué en el mundo de JavaScript.Lo sentimos, parece que ese contenido ha sido eliminado. Aquí hay un enlace a la copia archive.org en su lugar. Funciona hoy :PAGSfuente
fuente