2010-01-31 10 views
6

¿Cuáles son las diferencias entre estas dos formas de crear una clase:diferencia entre estas 2 formas de crear una clase en javascript

var apple = { 
    type: "macintosh", 
    color: "red", 
    getInfo: function() { 
     return this.color + ' ' + this.type + ' apple'; 
    } 
} 

function Apple (type) { 
    this.type = type; 
    this.color = "red"; 
    this.getInfo = function() { 
     return this.color + ' ' + this.type + ' apple'; 
    }; 
} 

y cómo se instancia y utiliza los miembros?

+0

Usted solo está creando un objeto y no una clase. – Gumbo

Respuesta

6

Si bien JavaScript es un lenguaje orientado a objetos, no utiliza clases. No creas una "clase" en JavaScript. Usted crea un "prototipo". JavaScript se considera Prototype-based language.

El primer ejemplo se conoce como "object-literal notation" para la creación de un objeto (un subconjunto de los cuales es conocido popularmente como JSON). Una analogía de esto en los lenguajes basados ​​en clases es una clase "estática", en el sentido de que no es necesario crear una nueva instancia de un objeto en este caso; "Solo existe", una vez que lo defines. No lo instanciaría, accedería a los miembros de apple inmediatamente ya que apple ya es un objeto. También es similar a crear una clase anónima en Java. Se podría utilizar de esta manera:

alert(apple.getInfo()); 

Con el segundo ejemplo, se está creando un prototipo (no una clase), que se puede utilizar para crear instancias de objetos de tipo Apple. Se podía utilizar de esta manera:

var redDelicious = new Apple("Red Delicious"); 
alert(redDelicious.getInfo()); 

JavaScript le permite modificar y añadir al prototipo de un objeto, así que después de que declaró que su prototipo Apple, todavía podría seguir añadiendo o cambiar las cosas en ello como esto:

Apple.prototype.size = "7cm"; 

Al hacer esto, todos los objetos derivados del prototipo Apple obtendrán un campo size. Esta es la base de cómo funciona el PrototypeJS framework para modificar objetos nativos de JavaScript para agregar & funcionalidad de reparación.

Tenga en cuenta que se considera una mala práctica modificar el prototipo de objetos JavaScript nativos, por lo que debe evitar hacerlo siempre que sea posible.

+0

El primer ejemplo no es una clase estática. Es un objeto JS creado usando la sintaxis literal del objeto. – SolutionYogi

+0

@SolutionYogi Sé que no es una clase estática; Lo primero que mencioné en mi respuesta es que no hay clases en JavaScript. Sin embargo, es más fácil explicar la sintaxis basada en prototipos de JavaScript utilizando analogías con las que las personas ya están familiarizadas si han programado en un lenguaje que usa clases. –

+0

Todavía siento que llamarlo una 'clase estática' es completamente incorrecto. La clase estática no puede tener estado. Lo pondría de esta manera: en el lenguaje tradicional de OOP, no puedes crear un objeto sin clase, pero en JavaScript, puedes. Y eso es lo que hizo el usuario en el primer ejemplo. – SolutionYogi

3

Su primer enfoque es JavaScript Object Literal y se puede acceder por:

apple.type; // returns "macintosh" 
apple.getInfo(); // prints "red macintosh apple" 

También puede añadir sus propias propiedades como wasGood o price así:

apple.wasGood = "true"; 
apple.price = "0.50"; 
alert(apple.price); // alerts "0.50" 

Su segundo enfoque es crear instancias de un objeto y se puede acceder por:

var myApple = new Apple("macintosh"); 
myApple.type; // returns "macintosh" 
myApple.getInfo(); // returns "red macintosh apple" 

Adición de propiedades a su objetivo de Apple es necesario utilizar el prototype palabra clave:

Apple.prototype.price = "0.50"; 
Apple.prototype.wasGood = "true"; 
alert(myApple.price); // alerts "0.50" 
3

Estas son algunas diferencias:

  • La primera forma es incompleta, hay una falta punto y coma después de la última llave de cierre .

  • La primera forma crea un objeto, mientras que la segunda solo declara un constructor que se puede usar para crear objetos.

  • La primera forma solo puede crear un solo objeto, mientras que la segunda puede ser utilizada por la palabra clave new para crear varios objetos.

  • La primera forma no puede tomar ningún parámetro para afectar la forma en que se inicializa el objeto, mientras que la segunda sí puede.

La primera forma se crea un único objeto y asigna a la variable apple, que se puede utilizar para acceder a los miembros:

alert(apple.type); 

La segunda forma en que se utiliza la palabra clave new para crear instancias:

var green = new Apple('Signe Tillisch'); 
alert(green.type); 
Cuestiones relacionadas