Foros del Web » Programando para Internet » Javascript »

Prototype, Class.create

Estas en el tema de Prototype, Class.create en el foro de Javascript en Foros del Web. mi proble es el siguiente antes yo tenia creada una clase muy bonita que me crea tablas y es esta que tengo aquí <!-- function ...
  #1 (permalink)  
Antiguo 04/05/2007, 10:43
 
Fecha de Ingreso: mayo-2007
Mensajes: 5
Antigüedad: 17 años
Puntos: 1
Prototype, Class.create

mi proble es el siguiente antes yo tenia creada una clase muy bonita que me crea tablas
y es esta que tengo aquí


<!--

function TABLE(){
this.ini();
}

TABLE.prototype.ini=function(){
this.properties=new Array();
this.rows=new Array();
this.cols=new Array();
}

TABLE.prototype.getProperty=function(i,v){
var prd;
switch(i.toLowerCase()){
case 'id': prd="ID=\""+v+"\""; break;
case 'nm': prd="NAME=\""+v+"\""; break;
case 'cs': prd="CELLSPACING=\""+v+"\""; break;
case 'cp': prd="CELLPADDING=\""+v+"\""; break;
case 'bgc': prd="BGCOLOR=\""+v+"\""; break;
case 'bg': prd="BACKGROUND=\""+v+"\""; break;
case 'brdc': prd="BORDERCOLOR=\""+v+"\""; break;
case 'brd': prd="BORDER=\""+v+"\""; break;
case 'alg': prd="ALIGN=\""+v+"\""; break;
case 'cls': prd="CLASS=\""+v+"\""; break;
case 'stl': prd="STYLE=\""+v+"\""; break;
case 'w': prd="WIDTH=\""+v+"\""; break;
case 'h': prd="HEIGHT=\""+v+"\""; break;
case 'valg': prd="VALIGN=\""+v+"\""; break;
case 'cspan': prd="COLSPAN=\""+v+"\""; break;
case 'rspan': prd="ROWSPAN=\""+v+"\""; break;
case 'extra': prd=""+v+""; break;
case 'onc': prd="onClick=\""+v+"\""; break;
default: prd="";
}
return prd;
}

TABLE.prototype.addProperty=function(properties){
var prd;
if(properties!='undefined' && typeof(properties)=='object'){
for(var i in properties){
if(i!='cspan' && i!='rspan'){
prd=this.getProperty(i,properties[i]);
this.properties[this.properties.length]={'p':i,'prd':prd};
}
else{ continue; }
}
}
}

TABLE.prototype.addRow=function(properties){
var prd="";
if(properties!='undefined' && typeof(properties)=='object'){
for(var i in properties){
if(i!='cspan' && i!='rspan'){
prd+=" "+this.getProperty(i,properties[i]);
}
else{ continue; }
}
}
this.rows[this.rows.length]="<TR"+prd+">\n";
}

TABLE.prototype.addCol=function(dato,properties){
var prd="";
if(properties!='undefined' && typeof(properties)=='object'){
for(var i in properties){
if(i!='brd' && i!='brdc'){
prd+=" "+this.getProperty(i,properties[i]);
}
else{ continue; }
}
}
this.cols[this.cols.length]={'irow':(this.rows.length-1),'cols':'<TD'+prd+'>'+dato+'</TD>\n'};
}

TABLE.prototype.get=function(){
var _HTML_="<TABLE ";
for(var i in this.properties){
_HTML_+=this.properties[i]['prd']+" ";
} _HTML_+=">\n";

for(i in this.rows){
_HTML_+=this.rows[i];
for(var j in this.cols){
if(parseInt(i)==parseInt(this.cols[j]['irow'])){
_HTML_+=this.cols[j]['cols'];
}
}
_HTML_+="</TR>\n";
}
_HTML_+="</TABLE>\n";
//alert(_HTML_);
return _HTML_;
}


var t=new TABLE();
t.addProperty({cp:2,cs:0,brd:1}); //todos los parametros que quieras e includo estilos
t.addRow(); //tambien acepta parametros t.addCol(1);
t.addCol(2);
t.addCol(3);
t.addCol(4);
alert(t.get()); //retorna una tabla de una fila con 4 columnas

//End-->


YA ESTE ES EL CUENTO, RESULTA QUE DECIDI IMPLEMENTAR LA LIBRERIA prototype.js que por lo demas es muy buena... PERO AL AGRAMAR MI CLASE BONITA ME ME MANDA UN CINFIN DE COSAS RARAS Y ES POR QUE LA POTOTYPE TIENE DEFINIDO NUEVOS METODOS PARA LOS OBJETOS Y LOS TIENE ALTERADOS.. LA CUESTIOS ES QUE DECIDI IMPLEMENTAR MI CLASE A LA MANERA DE PROTOTYPE.. PERO CUANDO TRATO DE LLAMAR UN METODO INTERNO DE LA PROPIA CLASE COMO DENTRO DE UN METODO DE LA MISMA CLASE ME MANDA UN ERROR, PERO SI CREO UNA FUNCION EXTERNA A LA CLASE CON EL MISMO NOMBRE DEL METODO INVOCADO, EN ESTE CASO "getProperty", ME ASUME LA FUNCION EXTERNA, Y DEJA DE MANDAR EL ERROR, ESE ES MI PROBLEMA, HABER SI A ALGUIEN QUE HA TRATADO DE MIGRAR SUS CLASES A ESTA FORMA, LE A PASADO ALGO SIMILAR.. PORFA NECESITO QUE ME AYUDEN....

addProperty:function(properties){
var prd="";
properties=$H(properties);
if(properties!='undefined' && typeof(properties)=='object'){
properties.each(function(par){
if(par.key!='cspan' && par.key!='rspan'){


//AQUI MANDA EL ERROR
prd=this.getProperty(par.key,par.value);


alert(prd);
}
});
}
}




ASI VA QUEDANDO LA CLASE USANDO PROTOTYPE

var TABLE=Class.create();
TABLE.prototype={
initialize:function(){
this.Properties=new Array();
this.rows=new Array();
this.cols=new Array();
},
addProperty:function(properties){
var prd="";
properties=$H(properties);
if(properties!='undefined' && typeof(properties)=='object'){
properties.each(function(par){
if(par.key!='cspan' && par.key!='rspan'){
prd=this.getProperty(par.key,par.value);
alert(prd);
}
});
}
},
getProperty:function(par){
var prd;
var key=par.key;
var value=par.value;
switch(key.toLowerCase()){
case 'id': prd="ID=\""+value+"\""; break;
case 'nm': prd="NAME=\""+value+"\""; break;
case 'cs': prd="CELLSPACING=\""+value+"\""; break;
case 'cp': prd="CELLPADDING=\""+value+"\""; break;
case 'bgc': prd="BGCOLOR=\""+value+"\""; break;
case 'bg': prd="BACKGROUND=\""+value+"\""; break;
case 'brdc': prd="BORDERCOLOR=\""+value+"\""; break;
case 'brd': prd="BORDER=\""+value+"\""; break;
case 'alg': prd="ALIGN=\""+value+"\""; break;
case 'cls': prd="CLASS=\""+value+"\""; break;
case 'stl': prd="STYLE=\""+value+"\""; break;
case 'w': prd="WIDTH=\""+value+"\""; break;
case 'h': prd="HEIGHT=\""+value+"\""; break;
case 'valg': prd="VALIGN=\""+value+"\""; break;
case 'cspan': prd="COLSPAN=\""+value+"\""; break;
case 'rspan': prd="ROWSPAN=\""+value+"\""; break;
case 'extra': prd=""+value+""; break;
case 'onc': prd="onClick=\""+value+"\""; break;
default: prd="";
}
return prd;
}
};



nesecito ayuda urgente....
  #2 (permalink)  
Antiguo 04/05/2007, 17:48
 
Fecha de Ingreso: agosto-2004
Mensajes: 157
Antigüedad: 19 años, 8 meses
Puntos: 5
Re: Prototype, Class.create

Hola EmCiJey

No he utilizado Prototype, pero el método each utiliza como argumento una función, el ámbito de alcance de esta función no es el mismo que el de la clase y this no referencia a la clase sino que a window.

Para solventar este problema prototype tiene el método bind

Código:
properties.each(function(par){

}.bind(this))
o también puedes almacenar en una variable this;

Código:
 var _this = this;
properties.each(function(par){
  _this.metodoDeLaClase();
})

Como te dicho antes no he utilizado prototype y no se si tiene algún otro método mejor para casos como este.

Espero haberte sido de ayuda.

Salu2.
  #3 (permalink)  
Antiguo 04/05/2007, 20:52
 
Fecha de Ingreso: mayo-2007
Mensajes: 5
Antigüedad: 17 años
Puntos: 1
Re: Prototype, Class.create

O vale man... era la solucion que necesitaba ta funcionando bien... vale Bendiuones.. espero sigamos apoyandonos en lo k podamos cualkier cosa cuenta conmigo.. e doy mi mail [email protected]
si kieres me agregas a tu msn
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 22:19.