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
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
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?
HTMLDivElement.prototype
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:
Publicar un comentario