Blog

Métodos privados y métodos privilegiados

Mar 12, 2009 | Español | By Crysfel | 9 Comments | Read in English

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.

Métodos privados y métodos privilegiados
Author: Crysfel

I'm a software developer with 6+ years of experience, when I'm not developing software I may be writing a tutorial, you can follow me on twitter

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.

9 Responses to “Métodos privados y métodos privilegiados”

  • darcktruck Mar 13, 2009

    y los videos -.-!!

    • Crysfel Mar 13, 2009

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

      saludos :)

    • juan Mar 13, 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

  • LuisTe Aug 10, 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?

    • Crysfel Aug 10, 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.

  • treboR Oct 23, 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.

    • treboR Oct 23, 2009

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

  • Croston Apr 13, 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.

    • Crysfel Apr 13, 2010

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

      saludos

Leave a Reply







Updates

RSS

Subscribe to our feeds to receive updates of our newest posts and free tutorials.

Site search

Maybe we have what you need, would you like to search first?

Donations

Would you buy me a cup of coffee? I am sharing my knowledge and time with you, help this project grow. Thank you!