Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] ¿Modelador de Objetos?

Estas en el tema de ¿Modelador de Objetos? en el foro de Javascript en Foros del Web. Buenas caballeros! Una vez mas, una consulta sobre POO en JS, bien, estoy tentando crear un modelador de objetos, es decir, una función que contenga ...
  #1 (permalink)  
Antiguo 21/05/2013, 20:07
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
¿Modelador de Objetos?

Buenas caballeros!


Una vez mas, una consulta sobre POO en JS, bien, estoy tentando crear un modelador de objetos, es decir, una función que contenga un bucle para crear un numero muy grande de objetos.

Simplificado seria algo asi :

Código Javascript:
Ver original
  1. function prototipoModeladorObjects(){
  2.  
  3.   this.MetodoModelar = function(){
  4.      
  5.       for(i=100,x=0;x<i;x++){
  6.         this.ObjetoNuevo = new PrototipoPrueva();
  7.       }
  8.  
  9.  
  10.    }
  11. var ObjetoModelador = new prototipoModeladorObjects();
  12.  
  13.  
  14. }
  15.  
  16.  
  17.  
  18. function PrototipoPrueva(){
  19.  
  20. this.Existo = true;
  21.  
  22. }


Bien, ahora viene la pregunta ... ¿como podría hacer que el nombre de cada objeto fuese diferente?, es decir, por ejemplo : ObjetoNuevo1 , ObjetoNuevo2 , ObjetoNuevo3 ... ect


Quizas sea una cuestión un tanto redundante o quizás alguien me tome por loco .... Que no se burle nadie por favor!
  #2 (permalink)  
Antiguo 21/05/2013, 21:12
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ¿Modelador de Objetos?

Tu problema en particular se resuelve aprendiendo JavaScript. Usa la sintaxis de llaves con algún algoritmo para definir el nombre.

Código Javascript:
Ver original
  1. this['instance' + i] = new AmazingObject;

PD:
Modelador de objetos => Factory.

Leete 'Design Patterns' del GoF (googlealo) o esta versión más "noob friendly" (a mi me encantó en su momento, lo sigue haciendo :) ): http://amzn.com/0596007124

PD2: De nuevo, aprende JavaScript sin obsesionarte con objetos. En tu ejemplo estàs leakeando las variables 'x' e 'i' al contexto global.
PD3: Es PrueBa.
__________________
blog | @aijoona
  #3 (permalink)  
Antiguo 21/05/2013, 21:41
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 14 años, 6 meses
Puntos: 66
Respuesta: ¿Modelador de Objetos?

¿leakeando ?
  #4 (permalink)  
Antiguo 22/05/2013, 05:55
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ¿Modelador de Objetos?

Contaminando el scope global por definir variables globales implícitas.
__________________
blog | @aijoona
  #5 (permalink)  
Antiguo 22/05/2013, 08:20
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 14 años, 6 meses
Puntos: 66
Respuesta: ¿Modelador de Objetos?

vale y si en lugar de i hubiese puesto this.i o var i (aun no me defiendo del todo) el problema está solucionado?
  #6 (permalink)  
Antiguo 22/05/2013, 08:32
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ¿Modelador de Objetos?

Claro, las variables locales se definen con el var, si este es omitido, la variable se define en el contexto global*

*Caso particular es si esta variable ya está definida en algún scope "visible", caso en el que se sobreescribe la misma:

Código Javascript:
Ver original
  1. function outter() {
  2.   // Estos comentarios son validos una vez que la function es invocada
  3.   a = 1; // a es una variable global
  4.   var b = 2; // b es una variable local
  5.  
  6.   function inner() {
  7.     // Estos comentarios son validos una vez que la function es invocada
  8.     var a = 3; // a es una variable local
  9.     b = 4; // sobreescribe la variable local de outter (esto es un closure)
  10.     c = 5; // c es una variable global
  11.   }
  12.  
  13.   inner();  
  14. }
  15.  
  16. outter();
__________________
blog | @aijoona

Última edición por Aijoona; 22/05/2013 a las 08:45
  #7 (permalink)  
Antiguo 22/05/2013, 09:50
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: ¿Modelador de Objetos?

Aijoona, Estoy emocionado, cada vez que me respondes veo cosas nuevas, y no, no es ninguna broma.


En realidad, llevo como 3 años peleándome con JS, y teniendo en cuenta que vine de un lenguaje que no es tan simple como C++, cualquiera diría que con JS uno se acostumbra a lo bueno y simple demasiado rápido.

Nada de información gratuita!, digo esto, por que después de estos años, después de seguir infinidad de manuales, trozos de código libre, experiencia propia, me sorprende que en internet, que es mi medio de aprendizaje, sea raramente habitual que encuentre nuevos planteamientos como los de Aijoona.


Y reitero, que al menos, yo , antes de venir a molestar al personal siempre busco por mi cuenta la solución.


Es decir, que la mayoria de contenido que encontraremos en internet, es repetitivo y solo de vez en cuando, nos topamos con contenido inedito, como es el caso.


bien, vamos al caso :

Cito a Aijoona:

Código Javascript:
Ver original
  1. this['instance' + i] = new AmazingObject;

Aquí veo algo asombroso, que en estos tres años, no vi en ningún medio, this+Cadena

y eso que yo habia intentado algo parecido como por ejemplo :

Código Javascript:
Ver original
  1. this.'instance'+i = new AmazingObject;

Por cierto, tienes razón en cuanto a mi error con las variables para el bucle, supongo que se solventaría inicializandolas así : (var x = 100, var i=0;i<z;i++);

Pero tengo una pregunta en cuanto al medio de crear un nombre para el objeto, bien, olvidémonos de los objetos, vamos a inicializar una variable con un nombre que se pueda guardar en una cadena.

Siguiendo tu ejemplo :

Código Javascript:
Ver original
  1. var i = 0;
  2.  
  3. var cadena = '';
  4.  
  5. for(var j=0;j<100;j++){  
  6.    var ['variable'+i] = 1;
  7.    cadena.concat(['variable'+i]);
  8.    i++;
  9. }


Factible? , aunque sinceramente, mi planteamiento para modelar objetos llega mediante un planteamiento erróneo de un problema que me surgió a raíz de mi nuevo proyecto de JS en POO , vamos a juntar mis últimos tres Post de JS en POO y planteare ese problema :

Crearemos un Prototipo Persona :

Código Javascript:
Ver original
  1. function Persona(name, age, money){
  2.  
  3. this.Name = name;
  4. this.Age = age;
  5. this.Money = money;
  6.  
  7. }

Ahora extenderemos este prototipo a otro prototipo, Profesor, del que tambien heredará los argumentos del constructor..

Código Javascript:
Ver original
  1. Profesor.prototype = new Persona();
  2.  
  3. function Profesor(asignatura){
  4.  
  5. Persona.call(this ,name, age, money);
  6. Profesor.call(this adignatura);
  7.  
  8. this.Asignatura = Asignatura;
  9.  
  10.  
  11. }
  12.  
  13. var Titos = new Profesor('titos', 30, 1000, matematicas);


Hasta aquí todo lo aprendido, vamos a dar otro paso adelante, PROBLEMA :


Necesito tener un método de otro objeto creando nuevos profesores de forma regular. pero ...,

¿por que dale un nombre único a cada objeto profesor? no seria mejor crear un puntero a ese objeto?.


El problema es el siguiente, tengo otras funciones, digamos que tengo una función que modifica la edad o el dinero del profesor, y esa función necesita saber que profesor se le va a modificar esa propiedad, es decir, de forma automática, una función recibe por argumentos, el nombre o el puntero de un objeto profesor especifico para modificare alguna de sus propiedades.

¿que me sugerís?

Última edición por Albuss; 22/05/2013 a las 10:02
  #8 (permalink)  
Antiguo 22/05/2013, 11:40
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ¿Modelador de Objetos?

Este código está mal:

Código Javascript:
Ver original
  1. var i = 0;
  2.      
  3.     var cadena = '';
  4.      
  5.     for(var j=0;j<100;j++){  
  6.        var ['variable'+i] = 1;
  7.        cadena.concat(['variable'+i]);
  8.        i++;
  9.     }

La sintaxis de llaves es para declarar o acceder a propiedades de objetos, no a variables.

---

Los objetos no tienen 'nombre', vos podes nombrar la referencia que haces hacia él.

Ej:

Código Javascript:
Ver original
  1. var profile = new Profile;

En ese caso, 'profile' es simplemente una variable que _apunta hacia_ el objeto. De más está decir que el objeto no sabe de la existencia del nombre de la variable ni se ve afectada por el mismo.

Es díficil hablar sin saber bien la situación, pero vamos a suponer. Pequeño ejemplo de lo que logro entender:

Código Javascript:
Ver original
  1. // Nuestras "clases"
  2. function Person(name, lastname, age) {
  3.   this.name = name;
  4.   this.lastname = lastname;
  5.   this.age = age;
  6. }
  7.  
  8. function Developer(name, lastname, age, langs) {
  9.   Person.call(this, name, lastname, age);
  10.   this.langs = langs || []; // Esto es el operador or, en una forma clasica
  11. }
  12.  
  13. // Extendemos
  14. Developer.prototype = new Person;
  15.  
  16. // Un par de instancias
  17. var phpDev = new Developer('Jose', 'Pelotas', 32, ['PHP']);
  18. var jsDev = new Developer('Juana', 'Amor', 33, ['JS']);
  19.  
  20. // Estas son expresiones, y el comentario es el valor
  21. // de las mismas
  22. phpDev.lang; // ['PHP']
  23.  
  24. var Company = {
  25.   employees: [],
  26.   teach: function(what) {
  27.     for(var i = 0, l = this.employees.length; i < l; i++) {
  28.       this.employees[i].langs.push(what);
  29.     }
  30.   }
  31. }
  32.  
  33. // Agregamos los programadores a la empresa
  34. Company.employees.push(phpDev);
  35. Company.employees.push(jsDev);
  36.  
  37. // Verificamos
  38. Company.employees.length; // 2
  39.  
  40. // Verificamos parte 2
  41. Company.employees[1].langs; // ['JS']
  42.  
  43. // Enseñamos java a nuestros pobres empleados
  44. Company.teach('Java');
  45.  
  46. // Y verificamos nuevamente
  47. Company.employees[1].langs; // ['JS', 'Java']



PD: Acostumbrate a indentar el código, ya sea a 2 o a 4 espacios (o un tab, por que no).
PD2: Corregí un pequeño error, no estaba llamando al constructor de Person dentro de Developer.
__________________
blog | @aijoona

Última edición por Aijoona; 22/05/2013 a las 12:35
  #9 (permalink)  
Antiguo 22/05/2013, 12:13
 
Fecha de Ingreso: septiembre-2006
Mensajes: 139
Antigüedad: 18 años, 2 meses
Puntos: 14
Respuesta: ¿Modelador de Objetos?

Excelente tu último ejemplo Aijoona.

Al menos a mí me ha servido.

Saludos.
Francisco J.
  #10 (permalink)  
Antiguo 22/05/2013, 12:47
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: ¿Modelador de Objetos?

En realidad el nombre si existe dentro de una variable, me explico,

var prueva = true;

¿que es prueva? prueva es un numero determinado de bytes en memoria que contienen la referencia al valor true, pero prueba es la referencia, y si, existe como nombre de referencia, es decir.

al haber declarado arriba una variable , primero estamos guardando en un numero finito de bytes en memoria, la ruta donde se guarda el valor booleano true, En C++ hay un metodo especifico para ver que ruta guarda cada variable, no se si existe en JS.

Pero seria algo como : prueva contiene la ruta : F000X16

Asimismo existe en la memoria una ruta para el nombre de definicion esa referencia, es decir, el nombre de la variable, por tanto ¿que estoy diciendo?

Digo, que si, existen los nombres como tales, ya que se guardan en la memoria , aparte de la ruta de memoria que referencia el valor al cual apuntan/referencian.


Que alguien me rectifique si me equivoco en mi planteamiento, asimismo.
  #11 (permalink)  
Antiguo 22/05/2013, 12:54
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años, 6 meses
Puntos: 343
Respuesta: ¿Modelador de Objetos?

Nunca dije que no exista, sino que el objeto que referencias a la variable no tiene conocimiento de la misma.

*A menos que hagas una referencia explicita en algun lugar del mismo claro está.

PD: Por el amor de jebús, es prueBa con b de bueno.
__________________
blog | @aijoona
  #12 (permalink)  
Antiguo 22/05/2013, 13:04
Avatar de Albuss  
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 9 meses
Puntos: 30
Respuesta: ¿Modelador de Objetos?

He aprendido a utilizar prototype.call() para recuperar los argumentos de las herencias, he aprendido denominar un nombre de un objeto de forma única cuando se crea, he aprendido a instancia objetos dentro de metodos de otros objetos. Y todo esto gratis ( y poco a poco aprendo gramatica xD). I love this

Etiquetas: js, objetos
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 01:36.