Foros del Web » Programando para Internet » Javascript »

Objetos en javascript

Estas en el tema de Objetos en javascript en el foro de Javascript en Foros del Web. Holass, Que yo sepa hay 2 posibles formas, o por lo menos las mas usuales, de crear objetos en javascript. Una es la tradicional, la ...
  #1 (permalink)  
Antiguo 19/04/2010, 00:37
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 0
De acuerdo Objetos en javascript

Holass,

Que yo sepa hay 2 posibles formas, o por lo menos las mas usuales, de crear objetos en javascript.

Una es la tradicional, la que implementa el core de javascript, es decir, con las clausulas function, new y this. Se puede aplicar herencia entre objetos pero ya es mas complicado y poco usado en javascript. Permite crear atributos y metodos publicos y privados. Es cierto que el codigo queda un poco feo, pero funciona bien.

Ahora bien, hay otra segunda forma que a veces he visto, pero que en mi opinion no deberia usarse porque no es ese su proposito. Se trata de usar objetos JSON y añadirles atributos y metodos. Tiene una grandisima ventaja, el codigo queda muy limpio y ordenado, pero tiene un gravisimo inconveniente, no permite atributos ni metodos privados. Todo atributo o metodo que pongas sera publico y se podra modificar, por lo que el termino "objeto" deja de tener sentido. Un ejemplo seria el siguiente:

Código Javascript:
Ver original
  1. var miObjeto = {
  2.     atributo1: 10,
  3.     atributo2: ["casa", "ventana", -1],
  4.     funcion1: function (){
  5.         this.atributo1 += 5;
  6.     }
  7.     funcion2: function (param1){
  8.         this.atributo2[2] = param1;
  9.     }
  10. }
  11.  
  12. miObjeto.atributo1 = -2;
  13. miObjeto.funcion2 (15);
  14. miObjeto.funcion1 = function (){
  15.     alert ("nueva funcion");
  16. }

Como se ve, se esta utilizando un objeto JSON como un objeto tradicional cuando su objetivo original es facilitar el intercambio de datos mediante AJAX.

Creeis que es buena? Mala practica?
Vosotros como haceis vuestros objetos en javascript (si es que usais).
  #2 (permalink)  
Antiguo 19/04/2010, 09:13
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 3 meses
Puntos: 1532
Respuesta: Objetos en javascript

realmente nunca he tenido la necesidad de crear atributos privados en JS, de todas formas JS no maneja un mecanismo de herencia tradicional (polimorfismo por herencia como C#, java, php, etc), maneja lo de la clase prototipo que es ligeramente diferente y prácticamente nunca lo he usado.

js es un lenguaje limitado y por lo tanto lo uso para lo básico, uso json porque es una manera simple y rápida de hacer las cosas, además no todos los navegadores manejan el core de la misma forma, en cambio json es un estándar ampliamente difundido
  #3 (permalink)  
Antiguo 19/04/2010, 14:07
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Objetos en javascript

Cita:
Iniciado por GagleKas Ver Mensaje
Tiene una grandisima ventaja, el codigo queda muy limpio y ordenado, pero tiene un gravisimo inconveniente, no permite atributos ni metodos privados. Todo atributo o metodo que pongas sera publico y se podra modificar, por lo que el termino "objeto" deja de tener sentido.
Está equivocado. Deberías leer acerca de module pattern y también acerca de mixin.
  #4 (permalink)  
Antiguo 19/04/2010, 14:31
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Objetos en javascript

Javascript no es un lenguaje limitado, de hecho es un lenguaje muy poderoso gracias a que es orientado a objetos (todo en javascript es un objeto). La herencia es algo ampliamente usado en javascript, solo que es herencia de tipo prototype. Los invito a que vean las conferencias dictadas por Douglas Crockford, una en especial Javascript the good parts
__________________
I see dead pixels
  #5 (permalink)  
Antiguo 19/04/2010, 15:10
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 0
Respuesta: Objetos en javascript

Cita:
Iniciado por Panino5001 Ver Mensaje
Está equivocado. Deberías leer acerca de module pattern y también acerca de mixin.
Podrias poner un ejemplo de un objeto JSON usando metodos y atributos privados. Este hilo es para aportar algo, no solo para criticar. ;)
  #6 (permalink)  
Antiguo 19/04/2010, 16:11
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Objetos en javascript

Lo puedes ver corriendo en jsbin
Código Javascript:
Ver original
  1. var app = {
  2.      public : 'soy publico',
  3.      publicMethod : function() {
  4.          var private = 'soy privado.',
  5.              self = this,
  6.              privateMethod = function() {
  7.                alert('Soy un metodo privado que puede:');
  8.                alert('llamar a un elemento publico: ' + self.public);
  9.                alert('llamar a un elemento privado: ' + private);
  10.              }
  11.            
  12.              
  13.         privateMethod();
  14.      }
  15. }
  16.              
  17. app.publicMethod();
__________________
I see dead pixels
  #7 (permalink)  
Antiguo 19/04/2010, 16:33
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 3 meses
Puntos: 1532
Respuesta: Objetos en javascript

public : 'soy publico' -> aquí public cumple el rol de la variable, no se especifica que sea público, lo es por su ámbito ¿para hacerlo privado como haría y evitar: app.public?

no soy experto en js, pero realmente no veo similitudes con respecto a variables de ámbito privado aquí con respecto a otros lenguajes ¿? :S

Código PHP:
class app{
    private 
$privado"privado"//mismo ámbito, diferente modificador de acceso (esto no lo se hacer en js)
    
public $publico="publico";
}

class 
app2 extends app{
    public function 
__construct(){
        
parent::$privado="modificando el privado desde clase derivada"//error Cannot access private property app::$privado in...
    
}
}

$i = new app();

echo 
$i->privado//error Cannot access private property app::$privado in...
$i2 = new app2(); 
lo que realmente si se le acerca es el método pattern: http://www.yuiblog.com/blog/2007/06/12/module-pattern/

Última edición por maycolalvarez; 19/04/2010 a las 16:55
  #8 (permalink)  
Antiguo 19/04/2010, 19:39
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Objetos en javascript

GagleKas no fue mi intención criticar sino alertarte sobre tu error de concepto y, al mismo tiempo, darte pistas de dónde buscar. Pero bueno, te dejo un ejemplo donde están bien diferenciados los métodos públicos y privados, usando una función que retorna un objeto que contiene los métodos públicos:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title></title>
<
script>
var 
panino=(function(){
/* ---- métodos privados ---- */
    
var metodosPrivados={
        
addEvent: function(typefn ) {
            if ( 
this.addEventListener ) {
                
this.addEventListenertypefnfalse );
            } else if(
this.attachEvent){
                var 
_this=this;
                var 
f= function(){fn.call(_this,window.event);}
                
this.attachEvent'on'+typef);
                
this[fn.toString()+type]=f;
            }else{
                
this['on'+type]=fn;
            }
            var 
ev={_obj:this,_evType:type,_fn:fn};
            
window.EvRegister=window.EvRegister || [];
            
window.EvRegister.push(ev);
            return 
this;
        },
        
removeEvent: function(typefn ) {
            if( 
this.removeEventListener){
                
this.removeEventListenertypefnfalse );
            }
            else if(
this.detachEvent){
                
this.detachEvent('on'+type,this[fn.toString()+type]);
                
this[fn.toString()+type]=null;
            }
            else{
                  
this['on'+type]=function(){};
            }
            for (var 
ii0l=window.EvRegister.lengthii ii++) {
                if (
window.EvRegister[ii]._evType== type && window.EvRegister[ii]._obj==this && window.EvRegister[ii]._fn==fn) {
                    
window.EvRegister.splice(ii1);
                    break;
                    
                }
            } 
            return 
this;
            },
         
css:function(propiedad,valor){
             if(!
valor)
                return 
this.style[propiedad];
            
this.style[propiedad]=valor;
            return 
this;
         },
         
hover:function(a,b){
             
this.addEvent('mouseover');
            
this.addEvent('mouseout');
            return 
this;
         },
         
alfa:function(value){
            
this.style.opacity value;
            
this.style.MozOpacity value;
            
this.style.KhtmlOpacity value;
            
this.style.filter 'alpha(opacity=' value*100 ')';
            
this.style.zoom=1;
            return 
this;
        },
        
toggle:function(a,b){
            
this.style.display=this.style.display=='none'?'block':'none';
            if(!!
&& !!b)
                
a.parentNode.replaceChild(b,a);
            return 
this;
        },
        
extendido:true
         
    
}
/* ---- métodos públicos ---- */
    
return{
        
extend:function(el,obj){
            if(
el.extendido && el!=metodosPrivados)return el;
            for(var 
i in obj)
                
el[i]=obj[i];
            return 
el;
        },
        
get:function(id){
            if(!
document.getElementById(id))return false;
            return 
panino.extend(document.getElementById(id),metodosPrivados);
        },
        
getO:function(obj){
            return 
panino.extend(obj,metodosPrivados);
        },
        
add:function(obj){
            
panino.extend(metodosPrivados,obj);
        },
                
        
unregisterAllEvents:function(){
                        if(
window.EvRegister)
            while (
window.EvRegister.length 0) {
                   
panino.getO(window.EvRegister[0]._obj).removeEvent(window.EvRegister[0]._evType,window.EvRegister[0]._fn);
            }
            
window.EvRegister=null;
            for(var 
i=0;el=document.getElementsByTagName('*')[i];i++)
                if(
el.extendido)
                    for(var 
ii in metodosPrivados)
                        
el[ii]=null;
            
panino=null;
        }
    }    
})();
var $=
panino.get;
panino.getO(window).addEvent('unload',panino.unregisterAllEvents);
/*----ejemplo de uso--------*/
function a(){
    var 
_this=this;
    var 
p=0,alfa=alfa || .5;
    var 
int=setInterval(
            function(){
                
p+=(500-p)/10;
                
alfa+=.015;
                if(
p>=490){
                    
clearInterval(int);    
                }
                
_this.css('width',p+'px').css('height',p+'px').alfa(alfa>=1?1:alfa);
            },
13);
}
onload=function(){
    $(
'pp').css('backgroundColor','red')
    .
css('width','50px')
    .
css('height','50px')
    .
css('cursor','pointer')
    .
addEvent('click',a)
    .
alfa(.5);
}
</script>
</head>

<body>
<div  id="pp"></div>
</body>
</html> 

Última edición por Panino5001; 19/04/2010 a las 19:45
  #9 (permalink)  
Antiguo 20/04/2010, 02:39
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 0
De acuerdo Respuesta: Objetos en javascript

Gracias, ese ejemplo me sirvio de mucho juntamente con la explicacion oficial del module pattern de YUI. Por lo que veo jQuery utiliza el module pattern o algo parecido, me equivoco?

Buenisimoss links Sergemedina

Última edición por GagleKas; 20/04/2010 a las 02:59

Etiquetas: 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 17:19.