Foros del Web » Programando para Internet » Javascript »

Definir todas las propiedades directamente dentro del prototype

Estas en el tema de Definir todas las propiedades directamente dentro del prototype en el foro de Javascript en Foros del Web. Estuve leyendo ultimamente y vi que la mayoria usa la propiedad "prototype" para definir metodos que luego podran usarse por los objetos que fueron instanciados ...
  #1 (permalink)  
Antiguo 12/08/2013, 19:57
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 11 años, 4 meses
Puntos: 35
Definir todas las propiedades directamente dentro del prototype

Estuve leyendo ultimamente y vi que la mayoria usa la propiedad "prototype" para definir metodos que luego podran usarse por los objetos que fueron instanciados por una funcion constructora
Código Javascript:
Ver original
  1. function Animal(){
  2. }
  3. Animal.prototype.setName = function(name){
  4.   //do something
  5. }
De esta manera todos los objectos creados del tipo Animal tendran el metodo setName, el cual es creado solo una vez, en contrapartida a esto se podria definir dicho metodo en el constructor
Código Javascript:
Ver original
  1. function Animal(){
  2.   this.setName = function(name){
  3.   //do something
  4.   }
  5. }
Pero ello no seria eficiente, ya que estariamos creando un metodo setName por cada objecto que instanciemos.

Entonces la pregunta que cae de maduro es,
¿porque directamente no definimos todas las propiedades a traves del prototype?
Código Javascript:
Ver original
  1. function Animal(){
  2. }
  3. Animal.prototype.name = 'default';
  4. Animal.prototype.age = 'default';
  5. Animal.prototype.id = 'default';
  6. etc....
  7.  
  8. Animal.prototype.setName = function(nombre){
  9.   this.name = nombre;
  10. }
__________________
I am Doyle please insert code.
  #2 (permalink)  
Antiguo 12/08/2013, 21:09
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 10 años, 6 meses
Puntos: 1485
Respuesta: Definir todas las properties directamente dentro del prototype

buenas...
se puede hacer así, definiendo todas las propiedades en prototype. pero puede haber ocasiones en que las propiedades siempre tendrán un valor distinto por cada instancia. en ese sentido, la propiedad en prototype podría funciona como un valor por defecto cuando no se le asigna un valor a una propiedad en particular. pero lo más común es que no vas a tener dos instancias exactamente con los mismos valores, aunque puede suceder. en fin, dependerá de como quieres diseñar tus datos.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 13/08/2013, 05:48
Avatar de ipraetoriux  
Fecha de Ingreso: abril-2010
Ubicación: ipraetoriux.com
Mensajes: 1.125
Antigüedad: 9 años, 6 meses
Puntos: 154
Respuesta: Definir todas las propiedades directamente dentro del prototype

...el Prototype Pattern es bien empleado cuando todas las instancias de un objeto van a compartir una propiedad que tenga el mismo valor...de esta forma cuando creas instancias de un objeto, dicha propiedad existe solamente en el prototype y no en la instancia...

Código Javascript:
Ver original
  1. function Animal(){
  2. }
  3. Animal.prototype.name = 'perro';
  4.  
  5. var perro1 = new Animal();
  6. var perro 2 = new Animal();
  7.  
  8. console.log(perro1.hasOwnProperty("name")); // retornará false

...para que dicha propiedad exista en la instancia deberias sobre escribir la propiedad del prototype

Código Javascript:
Ver original
  1. perro1.name = "gato";
  2. console.log(perro1.hasOwnProperty("name")); // retornará true


...pero de esta forma se perdería el motivo o fin de usar el Prototype Pattern

...por ello la forma mas común de definir objetos es usando el Constructor Pattern y el Prototype Pattern. Por medio del Constructor Pattern defines las propiedades de instancia, y por medio del Prototype Pattern defines los métodos y propiedades compartidas
  #4 (permalink)  
Antiguo 13/08/2013, 08:46
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 8 años, 6 meses
Puntos: 343
Respuesta: Definir todas las propiedades directamente dentro del prototype

Hay que tener cuidado a la hora de asignar objetos como atributos del prototipo, ya que al ser compartido entre todas las instancias puede llevar a comportamientos inesperados:

Clásico ejemplo de esto:

Código Javascript:
Ver original
  1. var Logger = function() {};
  2.  
  3. Logger.prototype._log = [];
  4.  
  5. Logger.prototype.log = function(message) {
  6.     this._log.push(message);
  7. };
  8.  
  9. var logger = new Logger;
  10.  
  11. logger.log('Hello');
  12.  
  13. var anotherLogger = new Logger;
  14.  
  15. anotherLogger.log(' World!');
  16.  
  17. anotherLogger._log; // ["Hello", "World!"]
__________________
blog | @aijoona
  #5 (permalink)  
Antiguo 13/08/2013, 11:40
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 11 años, 4 meses
Puntos: 35
Respuesta: Definir todas las propiedades directamente dentro del prototype

Ok entiendo, en el ejemplo de Aijoona surge el concepto de mutabilidad, donde los tipos de datos primitivos (Boolean, string, numbers) no puede cambiar sus valores, a diferencia de los arrays u objetos que sí son mutables. Por eso _log va mutando/cambiando para ambas instancias de Logger.
Gracias a todos, ahora depende de mi aplicar el uso de propiedades en el prototype correctamente ;)
__________________
I am Doyle please insert code.

Etiquetas: definir, directamente, funcion, properties, prototype, todas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:38.