2012-03-21 14 views
6

Tengo experiencia en OOP. Empecé a trabajar mucho con JavaScript. A medida que el proyecto crece, cada vez es más difícil mantenerlo. En Java, aplico los principios de OOP para mantener las cosas bajo control. ¿Qué debo hacer con JavaScript? ¿Qué debo estudiar para mantener una aplicación de JavaScript bajo control?OOP vs JavaScript

+0

Eche un vistazo a Backbone.js, y tal vez a Coffeescript. Ellos trabajan muy bien juntos. – asawyer

+13

JavaScript está orientado a objetos. – Gumbo

+0

echa un vistazo a [helephant] (http://helephant.com/2008/08/17/how-javascript-objects-work/) para algunas ideas de OO. – jbabey

Respuesta

6

Puede aplicar los principios de OOP al desarrollo de Javascript también. Javascript usa herencia prototípica, pero ese es un detalle de implementación. Los conceptos son los mismos La mayoría de los conceptos con los que está familiarizado tienen análogos directos en javascript.

Otros métodos probados y verdaderos aplican así:

1) permanecer seco - ¿No te repitas. El código duplicado siempre es malo.
2) Preocupaciones separadas - Utilice los patrones MVC o MVVM para mantener el código limpio y haciendo solo 1 cosa.
3) Prueba - Cuando escucho "Difícil de mantener", mi cerebro traduce eso en falta de pruebas. Sin duda, puede escribir pruebas unitarias para proyectos de JavaScript.
4) revisión de código - Código revisiones pueden ser una buena manera de rechazar código duplicado, código que no se hace a mano correctamente, no formateada, etc ....

+0

... bueno, lo suficientemente cerca. La distinción es importante saber sin embargo; definitivamente vale la pena echarle un vistazo. –

+0

¿Qué quiere decir "lo suficientemente cerca"? ¿Estás en desacuerdo? – hvgotcodes

+0

Un prototipo no es sinónimo de una subclase; hay algunas diferencias sobre cómo se 'adoptan' los campos y las funciones. Por ejemplo, varios objetos que comparten un prototipo comparten literalmente un campo prototipo, y cambiarlo puede cambiar una propiedad para todos los subobjetos. –

-1

En JavaScript, las funciones son objetos; Mozilla Developer Network,McKoss,SitePoint, y JavaScript Kit explica más.

Ejemplo de JavaScript Object

function myObj() { 
    this.myMethod = function() { 
    alert('hello'); 
    } 
} 
var demo_obj = new myObj(); 
demo_obj.myMethod(); 

patrones para mantener las cosas bajo control

  • Los patrones enumerados aquí son particulares de JavaScript.
    1. Use a Script Loader.
    2. Use a JS Framework.
    3. Lint your JavaScript. - Las herramientas están disponibles para ejecutar esto en su escritorio en Rhino o nodo.
    4. Minify your JS.
  • Los patrones enumerados aquí son típicos de la programación orientada a objetos Idiomas, y no son particulares de JavaScript.
    1. DRY - No repita el proceso.
    2. Patrón de observador (Pub/Sub).

anti-patrones a dejar que las cosas fuera de control

  1. contaminar el espacio de nombres
  2. uso de eval()
  3. Prototipos contra el objeto Objeto
  4. línea de secuencias de comandos Etiquetas
  5. uso de document.write
+3

¿Y cómo responde esto a la pregunta? – delnan

0

Cuando estaba en la misma situación que empezó a mirar "cómo otros lo hicieron". Terminó con http://dojotoolkit.org/ y http://jquery.com y estaba buscando cómo implementar widgets/plugins para que otros puedan ampliar el marco.

2

Así es como define objetos y métodos en javascript.

function SomeObj() { 

    this.someMethod = function() { 
     alert('boo'); 
    } 
} 

var o_obj = new SomeObj(); 
o_obj.someMethod(); //alerts "boo" 

Espero que ayude.

También puede usar prototipos para crear funciones estáticas.

this.prototype.someMethod = function() { 
    alert('boo'); 
} 
+0

Utilice * primera letra mayúscula * en 'someObj'. Es una conversión de nomenclatura estándar en JavaScript. Muestra que uno debe 'nuevo' para crear instancia del objeto. Compare con por ejemplo 'var now = new Date();'. – Oleg

+0

Eso es verdad. Los nombres de los objetos incluso se volvieron de color azul, ahora que comienzan con mayúscula. – c0d3Junk13

+0

Le recomiendo adicionalmente que use http://www.jslint.com/ para verificar el código. Usted . Vería 'Un nombre de constructor 'someObj' debería comenzar con una letra mayúscula' en su código anterior. Además, encontrará que debe incluir ';' después de 'this.someMethod = function() {alert ('boo'); } 'porque es una declaración de asignación. – Oleg

0

Otra manera de definir objetos y métodos simples en javascript (sin la necesidad de new).

function creaeSomeObj() { 
    var that = {}; 
    that.someMethod = function() { 
     alert('boo'); 
    } 
    return that; 
} 

var o_obj = createSomeObj(); 
o_obj.someMethod(); //alerts "boo" 

Este patrón no es compatible con la herencia, pero muchas veces es suficiente.

0

¿Por qué "vs"? JavaScript es compatible con la programación orientada a objetos, pero no de la manera tradicional de clase que se ve en, por ejemplo, Java.

El funcionamiento de programación orientada a objetos de JavaScript se conoce generalmente como "herencia de prototipos", o más específicamente "herencia de prototipos delegativa". Esto se puede reducir a "si buscas la propiedad 'foo' en un objeto, y no puedes encontrarla allí, entonces intenta buscar 'foo' dentro del prototipo del objeto en su lugar". Es decir, la búsqueda de la propiedad es delegadas a prototipo del objeto (se dice que el objeto hereda las propiedades del prototipo).

La herencia prototípica de la forma tiene algunas implicaciones. Por ejemplo:

  • Los objetos en JavaScript son "dinámicos" en el sentido de que son solo un conjunto de pares de nombre-valor. Las nuevas propiedades se pueden agregar y eliminar durante el tiempo de ejecución, por lo que son mucho menos "estáticas" que los objetos en el sentido de clase típico.
  • El funcionamiento de herencia de prototipos delegativos ("si no se puede encontrar el prototipo aquí, a continuación, busque aquí lugar") significa que es mucho más simple de programación orientada a objetos clásica. Desde un punto de vista puramente prototípico, no necesita constructores, por ejemplo. Los "métodos" son simplemente funciones regulares que se adjuntan al prototipo (lo que significa que están disponibles como propiedades en todos los objetos que heredan).

Hay pros y los contras de ambos prototipos y la herencia clásica, pero es importante recordar que son diferentes .

Ahora, JavaScript está en algunos sentidos inspirado en Java y otros lenguajes clásicos, por lo tanto, decidieron hacer la sintaxis "similar a una clase" para facilitar el inicio de las personas acostumbradas a las clases. No elaboraré mucho sobre esto; ya está documentado en gran medida en otros lugares.

Algunos mensajes interesantes:

0

Pluralsight tiene un curso sobre este tema: Structuring JavaScript Code que puede proporcionar alguna información. Dos advertencias: 1. Todavía no me he sentado en el curso, pero el contenido se ve muy bien y me han impresionado con otros cursos de Pluralsight que he tomado, y 2. no es gratis (pero puede valer la pena el pequeño $ si le ahorra tiempo en el camino b/c tiene mejor estructura de código). No, no trabajo para Pluralsight.

Además de los frameworks js mencionados en este hilo, también puede mirar Knockoutjs - buenos tutoriales aquí learnknockoutjs.com. Knockout está enfocado en MVVM. Tenga en cuenta que hay una buena discusión en stackoverflow comparing Backbone to Knockout, y Pluralsight también tiene un curso sobre el uso de Knockout que he visto y recomiendo.