poo orientado objetos objeto metodos herencia es6 crear clases javascript oop

javascript - orientado - ¿Cómo puedo mejorar en OOP?



metodos de javascript (12)

Esto podría ser una pregunta extraña para muchos de ustedes, y realmente no sé si es correcto decir OOP en este contexto, porque OOP ( programación orientada a objetos ) generalmente se asocia con lenguajes de programación como C ++ y Java, y Lenguajes de programación no livianos o lenguajes de scripting . Mi pregunta, sin embargo, está en la categoría de JavaScript , que también está orientada a objetos. Sí sé sobre objetos, propiedades, métodos, prototipos y constructores, parece que no me viene a la mente cuándo usar objetos.

Cuando estoy escribiendo mis aplicaciones web, yo, por alguna razón, nunca uso objetos. Esto me molesta, porque cuando leo sobre objetos en una variedad de libros y artículos en línea, los objetos hacen que todo sea mucho más simple y, por decirlo de algún modo, ME ODIO repetirme, y es por eso que me gustaría saber cuándo usarlo. objetos.

Realmente quiero ser mejor en el uso de objetos y cuando usar objetos.

¿Puedes mencionar algunas situaciones que los objetos serían buenos? Sería realmente agradable haber anotado algo que sabes que puedes volver atrás y mirar cuando te confundes sobre cuándo usar estos malditos objetos :)

Me encantaría las respuestas simples que explican por qué y cuándo los objetos son preferibles.
También me gustaría que pudieras decirme si debo usar objetos cuando estoy en situaciones especiales generalmente adecuadas para objetos, es decir, cada vez que quieres _________, entonces usas un objeto ...

Realmente espero que entiendas mi pregunta y consideres que soy un tanto nuevo en este sitio y nuevo en JavaScript

¡Gracias!


Creo que el uso de clases en general y principios de programación orientada a objetos hace que el código sea más ordenado, más legible y te hace más productivo.


En mi opinión, creo que es mejor pensar en OOP en el contexto de un dominio particular o problema comercial. Por ejemplo, JavaScript usa objetos para modelar comportamientos y atributos del navegador, por ejemplo, Ventana, Marco, Historial ...

Un modelo de dominio de un problema de negocio contendrá objetos que se reflejarán en el código de programación escrito OOP. Por ejemplo, una solicitud de estudiante universitario tendrá objetos para estudiantes, profesores, cursos, currículos, salas, etc. En consecuencia, comience con su problema comercial y modele el dominio. Su código OOP debe tener objetos modelados de su dominio.

Fuente: http://csci.csusb.edu/dick/samples/uml0.html


Es posible que le interesen los patrones de diseño ( Libro , Wikipedia ), que le indican cómo resolver problemas comunes utilizando OOP. Muchos patrones de diseño clásicos pueden no ser tan relevantes para JavaScript, ya que en JavaScript existen otros elementos no OOP (por ejemplo, funciones), que pueden resolver algunos problemas aún más elegantes.

Algunos patrones de diseño simples que puedo recomendar para empezar:

  • Fábrica abstracta: posponer la instanciación de objetos. En JavaScript, en la mayoría de los casos, una función hará el trabajo.
  • Decorador: agrega funcionalidad de manera transparente a un objeto en tiempo de ejecución. También se puede anidar. Ejemplo de uso: registro
  • Compuesto: trata un árbol / gráfico de un objeto como un solo objeto.

Javascript es solo un lenguaje terrible para aprender OOP. Recomiendo aprender OOP en otro idioma (como Java o C ++) y luego aprender la sintaxis orientada a objetos en Javascript. En ese momento tienes todos los ingredientes.

Es entonces cuando puede decidir si desea usar un objeto para una tarea en Javascript o si es suficiente para usar solo funciones.

Personalmente, escribo javascript sin objetos y dejo objetos para cuando una tarea se sienta orientada a objetos. Por ejemplo, utilicé un diseño orientado a objetos para un script de arrastrar y soltar, en el que simplemente creabas un objeto DragNDrop con los parámetros correctos y los elementos en tu página podían ser dragables a partir de ese momento, o cuando quería simplificar algunos javascript funciones de manejo de xml, escribí un objeto que envolvía los objetos xml normales.


Javascript está mucho, mucho menos orientado a objetos que C # o Java; no se preocupe si su Javascript no se ve orientado a objetos.


Justin Niessner lo dijo y solo puedo agregarle su respuesta ...

Además de la práctica, encuentro que leer el código de otras personas es muy instructivo. Debe tener cuidado porque no todos los códigos son ejemplares (por decir lo menos), pero el desarrollo de habilidades críticas es parte de la mejora.


Lo primero que hay que recordar es que una gran cantidad de código JavaScript simple no necesita definir objetos (su uso es inevitable, ya que todas las cosas que el DOM le da son objetos). No entre en pánico demasiado.

Una de las cosas buenas de Javascript es que admite muchos estilos diferentes; OOP, imperativo y funcional.

Una de las cosas malas sobre el uso de Javascript es que, dado que admite muchos estilos diferentes, es difícil aprender otro estilo, al menos hasta que te obliga un momento "a-ha" por otra cosa.

Pasar tiempo en idiomas que están más inclinados a forzarte a OOP (incluso cuando algunos dirían que no deberían) es útil aquí. C # y Java fuerzan uno a lo largo de las líneas OOP, aunque C ++ no (con la misma fuerza y ​​debilidad aquí que con Javascript).

Intenta pensar sobre las "cosas" en tu programa. Algunas de estas cosas ya estarán modeladas por objetos (aquellos que el DOM le brinda). Algunos realmente solo serán números y cadenas, y no vale la pena componer más allá de eso (aunque aprender a agregar funcionalidad a esos tipos mediante prototipos también es una buena idea). Algunos serán "cosas" más complicadas que un tipo simple y naturalmente adecuadas para modelar como un objeto.

Consulte también programación funcional en Javascript (por ejemplo, pasar una función como parámetro a otra función es sobre el ejemplo más simple), ya que la interacción entre esto y OOP es uno de los elementos más fuertes en Javascript y esencial en la definición de métodos en objetos dados el modelo de OOP basado en prototipos que tiene.


Mi experiencia personal con OOP en JavaScript es positiva, una vez que me di cuenta de que hiciera lo que quería, por supuesto, normalmente la uso en combinación con jQuery, por lo que el código resultante puede parecer un poco ... extraño.

function BlogPost(id,title,content) { this.id = id; this.title = title; this.content = content; function display() { var post = $(''<div class="blogpost"></div>''); $(post).append(''<h2>'' + this.title + ''</h2>''); $(post).append(''<p>'' + this.content + ''</p>''); var deleteButton = $(''<span class="deletePost">delete</span>'') $(post).append(deleteButton); $(deleteButton).click(this.delete) $(''#postcontainer'').append(post); } function delete() { $.post(''some/xhr/handeler'',{id:this.id}); } }

Esta es una clase rápida (no probada) que se puede usar para agregar dinámicamente publicaciones de blog a un div con id postcontainer ''y maneja los clics en un botón de eliminar.


Piense en cómo puede usar objetos para organizar y simplificar su aplicación. He encontrado dos metáforas útiles:

  • Un reloj mecánico se compone de una serie de engranajes, cada uno de los cuales tiene un único propósito en el funcionamiento general de la máquina. Si piensas en tu aplicación como un reloj, entonces los objetos son sus engranajes.

  • Un grupo de trabajo se compone de varias personas, cada una de las cuales realiza un trabajo específico. Las personas se comunican entre sí para realizar sus trabajos, y los trabajos se dividen en dos líneas: los que realizan tareas (trabajadores) y los que organizan y dirigen el trabajo de otras personas (gerentes).

Puede usar estas metáforas para organizar el trabajo que hace su aplicación. Comience por dividir la aplicación en capas funcionales; IU, capa de negocios y persistencia, por ejemplo. Tome cada uno de sus casos de uso y distribuya el trabajo que realiza entre estas capas. Eso debería darte un punto de partida para las clases que necesitarás.

Haga que cada clase sea independiente. quieres sellarlo cuando está hecho, como un control .NET. Las clases deben comunicarse entre sí solo a través de sus interfaces, que se componen de propiedades y métodos. Estas interfaces deben tener la huella más pequeña (menos propiedades y métodos públicos) que se puedan imaginar. La idea es aislar los efectos secundarios de un cambio en cualquier clase solo en esa clase.

Si haces estas cosas, estarás por delante del 80% de todos los programadores. Le resultará mucho más fácil desarrollar y mantener incluso aplicaciones de gran tamaño, ya que podrá descomponer problemas complejos en componentes simples.


Primero, no necesita usar objetos para evitar repetirse. Si necesita hacer lo mismo en dos puntos de su código, puede escribir una función normal no estándar OOP para hacer eso y llamarlo dos veces.

Para resumir las ventajas de OOP sin escribir un libro aquí, OOP básicamente hace tres cosas para usted:

  1. Agrupe los datos relacionados. Los programas no-OOP a menudo tienen un conjunto completo de variables flotando en el programa principal que solo están relacionadas de manera vaga. Con OOP, coloca variables relacionadas en un objeto.

  2. Asociar funciones con datos. Al poner funciones en un objeto con los datos sobre los que operan (los puristas dirán que son entonces "miembros" en lugar de "funciones"), le deja claro al lector que estos van de la mano.

La combinación de # 1 y # 2 le permite ocultar detalles de implementación de otros objetos. Usted crea la "interfaz pública" para una clase, el conjunto de funciones que otros objetos deben llamar y que representan las cosas lógicas que hace esta clase, y luego se puede ocultar cualquier otra función que necesite. (Más explícitamente en algunos idiomas que en otros, pero ese no es el punto aquí).

  1. Las clases pueden heredar y mutar. Si tienes dos clases similares A y B que deberían ser básicamente iguales, pero con algunas diferencias menores, puedes crear una superclase C con todas las cosas comunes y, a continuación, A y B heredarán de eso y cada una agrega cosas únicas. Esto es lo que generalmente se anuncia como el poder de OOP. Francamente, sí, es genial, y en algunas situaciones puede ser muy útil, pero solo uso su verdadero poder ocasionalmente, y sospecho que lo mismo es cierto para la mayoría de los programadores. (Los entusiastas de OOP se sienten libres para hablar sobre cómo y por qué usa la herencia todo el tiempo).

¿Cuándo OOP? Cada vez que tiene varios datos que lógicamente van juntos, tiene sentido crear una clase para contenerlos. Como las coordenadas X e Y; o nombre del cliente, dirección y código postal; o rango de phaser y consumo de potencia phaser; o lo que sea.

Cada vez que tenga funciones que lógicamente operen con estos datos relacionados, colóquelos en la clase con los datos. Como "mayúscula el nombre del cliente", "calcule la distancia de este punto desde el origen", etc.

Cómo y cuándo usar la herencia es más complicado. Lo dejo para otro momento.


Probablemente uses objetos sin siquiera darte cuenta.

Si está escribiendo Javascript que interactúa con DOM, está usando objetos.

Si está utilizando cualquiera de los frameworks de Javascript (jQuery, MooTools, etc.), está usando objetos.

El uso de objetos será útil cuando necesite encapsular algún código comúnmente utilizado para que pueda ser fácilmente reutilizado (dentro de una sola aplicación o en múltiples aplicaciones como los complementos de jQuery ... que son objetos en sí mismos).

Y para responder a la pregunta en el título de su publicación ... ¡la única forma de mejorar realmente en OOP es practicar! Leer y estudiar el tema solo puede llevarte tan lejos.


Recientemente trabajé en una aplicación web que requeriría un gran Javascript para el cliente.

Viniendo de C # / Java background me di cuenta de que Javascript requeriría un cambio de pensamiento, sin embargo, de todos modos quería aplicar buenos principios de OO, en particular para controlar la posible complejidad de la aplicación.

Después de buscar un poco, encontré un gran libro llamado Object Oriented Javascript de Stoyan Stefanov. Realmente me abrió los ojos al poder de este a menudo llamado "lenguaje de juguete". Algunas secciones sobre conceptos de programación funcional, alcance variable y cierres pueden incluso ser un poco más avanzadas de lo que usted desea.

Sin embargo, leer y aplicar muchos de estos conceptos de este libro (cierres, funciones anónimas, etc.) en Javascript, en realidad incluso me ayudó a volver al terreno de C #, donde estos conceptos ahora solo se están volviendo más convencionales.

Dada su situación y meta declaradas, puedo recomendar encarecidamente este libro como una de las mejores maneras de aprender sobre cómo hacer OO en Javascript.