Métodos privados y métodos privilegiados
Mar 12, 2009 | Español | By Crysfel | 9 Comments | Read in EnglishEste es un tema desconocido por muchos desarrolladores, algunos creen que esto no es posible hacerlo con JavaScript. En el tema de hoy veremos como ocultar propiedades y métodos en un objeto.
Propiedades y métodos privados
Para crear propiedades o métodos privados lo hacemos en el constructor. Los parámetros y variables ordinarias (las que se crean utilizando la palabra reservada “var”) así como los parámetros son propiedades privadas las cuales no pueden ser utilizadas desde el exterior del objeto. Los métodos privados son funciones dentro del constructor, este tipo de funciones no serán expuestas fuera del objeto. Veamos el siguiente ejemplo:
//The object User
var User = function(options){
//private properties
var name = options.name;
var password = options.password;
//public property
this.user = options.user;
//private method
function privateMethod(){
console.debug('im a private method!')
}
}
//new instance of User
var u = new User({name:'Crysfel',password:'***',user:'cvilla'});
console.debug(u.user); //cvilla
console.debug(u.name); //undefined
console.debug(u.privateMethod()); //throws error
En el ejemplo anterior se han agregado dos propiedades y un método privado, cuando intentamos imprimirlos en la consola de Firebug podemos ver que no se imprimen y el método lanza un error; esta es la manera en como se oculta la información dentro de un objeto.
Métodos privilegiados
Douglas Crockford le llama métodos privilegiados a los métodos que son públicos y que a la vez pueden acceder a las propiedades privadas y manipularlas, estos métodos son creados dinámicamente pues son agregados al objeto en tiempo de ejecución. Veamos un ejemplo:
var Person = function(options){
//private properties
var name = options.name
var birthYear = options.birthYear;
//private method
var calculateAge = function(){
var today = new Date();
return today.getFullYear() - birthYear;
}
//Privileged method
this.getAge = function(){
return calculateAge(); //calling private method
}
}
//new Person instance
var p = new Person({name:'Peter', birthYear:1983});
console.debug(p.getAge());// the age
console.debug(p.name);// undefined
console.debug(p. birthYear);// undefined
Los métodos privilegiados son una excelente herramienta y muy importantes para poder acceder a la información privada, de esta manera es como exponemos la información que sea necesaria. Es importante mencionar que los métodos privilegiados son creados en tiempo de ejecución pues están en el constructor del objeto y no en el prototipo (prototype object), en el siguiente ejemplo vamos a crear dinámicamente getter y setters para las propiedades que recibe el constructor mediante el parámetro “options”.
var Animal = function(options){
//a private method to do the job
//and to create a new scope (see last chapter of this course)
function createGetterAndSetters(properties,property){
//attach the getter for the current property
this['get'+property] = function(){
return properties[property];
}
//attach the setter for the current property
this['set'+property] = function(value){
properties[property] = value;
}
}
//iterate through the options
for(var property in options){
//call the private method with the right context
createGetterAndSetters.call(this,options,property);
}
}
//two different instances of Animal object
var zul = new Animal({breed:'Chihuahua',gender:'female',name:'Zul'});
var rocky = new Animal({breed:'Beagle',gender:'male',name:'Rocky'});
console.debug(zul.getbreed());//Chihuahua
console.debug(zul.getname());//Zul
console.debug(zul.name);//undefined
console.debug(rocky.getbreed());//Beagle
console.debug(rocky.getgender());//male
console.debug(rocky.getname());//Rocky
console.debug(rocky.breed);//undefined
En el ejemplo anterior se crean dinámicamente los getters y setters de las propiedades que se reciben como parámetro en el constructor, haciendo uso de un método privado para realizar el trabajo además de crear un nuevo scope cuando se manda a ejecutar permitiendo de esta forma acceder a los valores correctos, (si tienes alguna duda de este concepto te recomiendo leer el tema donde se ha explicado con mayor detalle el concepto del scope y el problema que existe cuando creamos dinámicamente métodos). Otro punto importante de comentar es en el ciclo for, ya que estamos invocando al método privado asignándole el contexto adecuado, de esta manera nos aseguramos que la variable “this” dentro del método privado esté haciendo referencia al objeto “Animal” (si tienes dudas al respecto te recomiendo leer el tema sobre el contexto).
Conclusiones
Es posible crear métodos y propiedades privadas así como los métodos privilegiados gracias a los “closures” que maneja JavaScript, ya que es posible acceder a las variables externas de la función contenedora aún cuando ésta haya finalizado su ejecución.
Lo métodos privados y privilegiados solo pueden ser definidos en el constructor (por los conceptos mencionados anteriormente), los métodos públicos pueden ser agregados en cualquier momento utilizando el objeto “prototype”.
Hemos visto como ocultar la información en un objeto, además de que hemos utilizado varios conceptos de temas anteriores como el scope, el contexto, closures; es importante tener en cuenta estos conceptos pues los utilizaremos más adelante. También veremos algunas utilerias que Ext JS nos proporciona para manejar de manera más sencilla estos términos.
Como siempre son bienvenidas las críticas, sugerencias, dudas o comentarios y por supuesto los votos en Digg o en tu red social favorita.







y los videos -.-!!