Aprendiendo Ext JS 3

Métodos privados y métodos privilegiados Más videos

Descripción del tema

Este 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.

Te gustaría recibir más tutoriales como este en tu correo?

Este tutorial pertenece al curso Aprendiendo Ext JS 3, te recomiendo revises el resto de los tutoriales ya que están en secuencia de menor a mayor complejidad.

Si deseas recibir más tutoriales como este en tu correo te recomiendo registrarte al curso, si ya eres miembro solo identifícate y registrate al curso, si no eres miembro te puedes registrar gratuitamente!

Si no gustas registrarte en este momento no es necesario! Aún así puedes recibir los nuevos tutoriales en tu correo! Jamás te enviaremos Spam y puedes cancelar tu suscripción en cualquier momento.

¿Olvidaste tu contraseña?

15Comentarios

  • Avatar-2 darcktruck 13/03/2009

    y los videos -.-!!

    • Avatar-12 Crysfel 13/03/2009

      :s lo siento de verdad... pero no tuve tiempo de realizarlos :( , los siguientes temas haré lo posible, gracias por tu observación ;) saludos :)

      • Avatar-10 juan 13/03/2009

        no importa Crysfel, ya que con el texto se puede aprender la lección sin problemas. Eso sí, los videos son un poco más didácticos, pero aún así, muchs gracias. Un saludo

        • Avatar-4 LuisTe 10/08/2009

          Hola Crysfel estoy viendo temas de javascript OO antes de entrar a Ext, y quisiera hacerte una pregunta, en el primer ejemplo si yo instancio: var user = new User(); y luego hago user.name="name1"; y luego muestro en consola user.name, aparece name1. Hay alguna forma de evitarlo?

          • Avatar-12 Crysfel 10/08/2009

            Hola LuisTe Te invito a registrate en el foro (http://foro.quizzpot.com) para platicar mejor y muestres el código que estas utilizando, porque este tutorial muestra como hacer lo que mencionas, me llama la atención lo que estas plantiando.

            • Avatar-8 treboR 23/10/2009

              solo tengo una pregunta...¿cómo sabe la función set el value ke le están entrando? disculpa si es algo muy evidente... es ke la POO en javascript me tiene medio mareao... solo la había visto en c++ y ahora estoy un poco confundido.

              • Avatar-11 treboR 23/10/2009

                ya me respondí Crysfel...disculpa...jejeje. ya logré entender.

                • Avatar-11 Croston 13/04/2010

                  Hola Crysfel, cuando comienzas a hablar de Métodos privilegiados, porque en el primer ejemplo, en esta propiedad privada: var birthYear = options. birthYear; porque dejas un espacio antes de "birthYear" Saludos. y Gracias.

                  • Avatar-1 Crysfel 13/04/2010

                    Error de edición, no debería tener ese espacio... saludos

                    • Avatar-9 anje 03/10/2010

                      Hola Crisfel. Eres un buen divulgador de javascript, tus articulos son interesantes, didacticos, profesionales y siempre con un toque personal en todos y cada uno de tus scripts. Con tus scrips siempre se aprende algo nuevo, por tanto me gustaria que me aclararas una duda. En tu segundo script "Métodos privilegiados" en estas dos lineas: var name = options.name var birthYear = options.birthYear; Haces referencia al argumento "options" con LAS DOS VARIABLES AL MISMO TIEMPO, despues creas una instancia de esta manera: var p = new Person({name:'Peter', birthYear:1983}); Los parametros pasados por "p" los llamas en una notacion deferente "{name:'Peter', birthYear:1983}" Como se llama esa tecnica y como funciona. Saludos. GRACIAS

                      • Avatar-1 Crysfel 04/10/2010

                        Esos parámetros son un objeto de configuración, esto es conveniente porque puedes mandar N cantidad de parámetros en un solo objeto ;)

                        • Avatar-11 Optimus 17/11/2010

                          Hola Crysfel es muy buena la exposición del tema javascript OO, Pero tengo una duda con respecto a crear objectos en javaScript. En un apartado del curso mencionas que existen dos maneras para crear objetos: 1. var obj = new Object(); 2. var obj = {... }; Como lo has mencinado mas de una vez, todo en javascript son objetos. La duda que tengo es que diferencia hay entre crear objetos como los antes mencinados y con esta: 3. var obj = function(){...}

                          • Avatar-3 Renzo Diaz 20/03/2013

                            Amigo Optimus... "var obj = function(){…}" no es un objeto es una variable que se le esta asignando una función seria lo mismo que hacer: "var abc = function(){…}" .. no te dejes llevar por el "obj"

                            • Avatar-6 Renzo Diaz 20/03/2013

                              xD 3 años despues... :) buen tutorial ^^

                              • Avatar-7 Joao 16/04/2015

                                aunque haya pasado mucho tiempo estaria bueno que puedas hacer videos de los que falten, muchas gracias por los tutos igual ;D

                                Instructor del curso

                                Crysfel3

                                Autor: Crysfel Villa

                                Es ingeniero de software con más de 7 años de experiencia en desarrollo web.

                                Descarga Código Fuente

                                Regístrate a este curso

                                Este tutorial pertenece al curso Aprendiendo Ext JS 3, revisa todos los tutoriales que tenemos en este mismo curso ya que están en secuencia y van de lo más sencillo a lo más complicado.

                                Tendrás acceso a descargar los videos, códigos y material adicional.

                                Podrás resolver los ejercicios incluidos en el curso así como los Quizzes.

                                Llevarás un registro de tu avance.