2011-08-22 14 views
6

¿Qué es un mejor modelo objeto Javascript ...¿Qué es mejor patrón objeto Javascript

function dog(name) { 
    this.name = name; 
    this.getName = function() { 
    return this.name; 
    }; 
}; 

O

function cat(name) { 
    this.name = name; 
}; 
cat.prototype.getName = function() { 
    return this.name; 
}; 

Y POR QUÉ?

----- edita

¿Uno o el otro uso más memoria?

¿Hay una más o menos "CPU" intensiva que la otra?

¿Cuál es más mantenible?

¿Cuál es más escalable?

¿Qué es más legible?

Respuesta

2

Solo una opinión personal aquí ... pero prefiero la notación estilo "perro" para la mantenibilidad a largo plazo.

Todos los códigos de "perro" se mantienen dentro de la definición del perro. Imagine que es 5 años más tarde y "el siguiente tipo" recibe instrucciones para eliminar la propiedad hasTail. No importa cuántos otros objetos/propiedades/etc. se definieron entre ahora y luego, él lo encontrará dentro de la definición del perro.

Para comparar ... imagine que es 5 años más tarde y "el siguiente tipo" recibe instrucciones de eliminar la propiedad hasTail de "cat". Él tiene que escanear/grep/ctl + f el archivo animals.js para hasTail y espero que elimine el correcto.

+1

Estoy de acuerdo con usted. Es mucho más fácil de seguir. ¿Pero la comprensibilidad tiene un costo? ¿Es más intensivo en "CPU"? –

+0

La respuesta de Ricardo aborda esa preocupación. En pocas palabras, sí, hay un impacto en la memoria al usar el estilo de perro si espera tener más de una instancia de perro instanciada. –

7

Preferencias aparte, el segundo ejemplo es el "correcto". En el primero, está creando una nueva función getName para cada objeto. En 2, todos los objetos creados con este constructor compartirán el prototipo/getName. Cámbielo en un lugar y cambiará para cada instancia.

En ocasiones especiales (como cadenas de herencia complejas) puede necesitar usar la primera, pero tenga en cuenta sus inconvenientes.

This blog post podría ayudarlo a comprender mejor la herencia de prototipos.

+0

Gracias, agregado a mis lecturas. –

0

Utilizo la notación cat porque no introduce cierres innecesarios, lo que puede ser un poco ineficiente.

Sin embargo, nunca he probado exactamente cómo son ineficientes, y podría no hacer una gran diferencia en esta era de motores de JavaScript hiper-optimizados.

0

Prefiero el método de gato que usa el prototipo.

  1. Prefiero no tener todos mis métodos sangrados un nivel más dentro del contructor.
  2. Prefiero que el código de constructor sea solo el código de constructor en lugar de muchas otras funciones, creo que hace que sea más fácil ver lo que está buscando.
  3. Prefiero usar el prototipo, por lo que no es necesario asignar todos los métodos cada vez que se ejecuta el constructor.
  4. También me parece que esta es la razón por la cual existe todo el prototipo, por lo que puede poner las cosas en que las instancias futuras heredarán automáticamente sin tener que ejecutar código para asignarlas.
  5. Además, si alguna vez desea hacer una mezcla, puede obtener todos los métodos del prototipo sin tener que construir uno de los objetos.
  6. Cuando empiezas a crear subclases, encuentro que el esquema de prototipos es mucho más comprensible.
  7. Me resulta más fácil buscar definiciones de métodos porque todos incluyen .prototype..
1

Personalmente prefiero ajustar las definiciones de función dentro del objeto (por ejemplo, la notación de perro), ya que es más como una "clase" de Java/PHP. Sin embargo, el uso de la notación de perro es menos eficiente con la memoria ya que las funciones se copian cada vez que se crea una nueva instancia (vea esto article)

+0

Sí, afirma al final que: "Es un equilibrio entre mejores parámetros de código y rendimiento. En estos días, este último es, gracias a Dios, no siempre el principal. No tiene que elegir entre los dos. Solo un miembro que necesita miembros privados tiene que ser parte de la función constructora, todos los demás pueden ser parte del prototipo ". –

Cuestiones relacionadas