Unite al grupo

Grupos de Google
Suscribirte a webandbeer
Correo electrónico:
Consultar este grupo

lunes, 26 de mayo de 2008

Demian Rodriguez - Explicacion JavaScript grosa

En la lista de correo de Web and Beer se mantubo una interesante discucion sobre JavaScript (mas que nada rescatamos los aportes de Demian Rodriguez), asi que aca les posteo algo de lo que se discution.




2008/5/25 Andrés Gattinoni :
Comparto un artículo que vi en el blog de YUI (Yahoo User Interface), donde explica una forma (un hack en definitiva) para aplicar una suerte de visibilidad en javascript.

http://yuiblog.com/blog/2008/05/24/durable-objects/

En definitiva esto es una variación de algo que el chabonito que escribió el artículo definió como "Module Pattern", que lo explican aca: http://yuiblog.com/blog/2007/06/12/module-pattern/

Saludos

A




Esa forma de implementar propiedades y metodos privados es muy villera e ineficiente. Al definir los metodos dentro del constructor estas copiandolos para cada instancia de la clase, o sea que se debe evaluar e interpretar cada funcion. Si en cambio se definen en el prototype, hay una sola copia del metodo para cada instancia de la clase. Hice una siemple prueba de rendimiento:


function Test() {
var value = [];
this.method = function() {
for (var i=0; i<10; i++) {
value.push(i);
}
};
this.getValue = function() {
return value;
}
}

function Test2() {}
Test2.prototype = {
value : [],
method : function() {
for (var i=0; i<10; i++) {
this.value.push(i);
}
},
getValue : function() {
return this.value;
}
};

var o;
var start = Date.now();
for (var i=0; i<10000; i++) {
o = new Test();
o.method();
}
alert(Date.now() - start); // 85ms~

start = Date.now();
for (var i=0; i<10000; i++) {
o = new Test2();
o.method();
}
alert(Date.now() - start); // 45ms~

Y sin tener en cuenta el consumo de memoria.



Bue ya que estamos entonces pongo un ejemplo de propiedades estaticas privadas. Esto no tiene el problema q antes mencioné, pero no se hasta que punto es útil. Se podria hacer una especie de Singleton, q se yo...


function Constructor() {}
Constructor.prototype = (function(){
var privateStaticProperty = "Hola mundo";
var privateStaticMethod = function() {

}
return {
publicProperty : 1,
publicMethod : function() {

}
};
})();



Ahi solo demuestran como tener propiedades y metodos privados pero no mencionan nada en cuanto a rendimiento. Si vas a tener unas pocas instancias de la clase esta todo bien, pero para mi no sirve de nada hacer ese quilombo ya que ademas en los comentarios pusieron varias formas de hackear esa privacidad.
El ejemplo que puse yo sería la forma mas óptima de definir los metodos y propiedades de una clase. Al instanciar una clase (función), el objeto hereda los metodos y propiedades del prototipo de esa función, incluso si fueron agregados despues de la instanciación. Esto es lo que permite extender los objetos nativos de JS y el DOM como hacen muchos frameworks.
Por ej, en Gecko yo puedo agregarle un metodo a todos los
del documento asi:
HTMLDivElement.prototype.metodoNinja = function() {};
Pero como el famoso IE no permite esto hay que agregar el metodo nodo x nodo. Ahi esta la diferencia básicamente, aunque se vería mejor si tuviera una herramienta para medir el uso de memoria de un script. Alguien conoce?



No hay comentarios: