Métodos privados y métodos privilegiados Más videos
Descripción del tema
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 errorEn 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);// undefinedLos 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);//undefinedEn 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.
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.
15Comentarios
y los videos -.-!!
:s lo siento de verdad... pero no tuve tiempo de realizarlos :( , los siguientes temas haré lo posible, gracias por tu observación ;) saludos :)
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
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?
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.
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.
ya me respondí Crysfel...disculpa...jejeje. ya logré entender.
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.
Error de edición, no debería tener ese espacio... saludos
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
Esos parámetros son un objeto de configuración, esto es conveniente porque puedes mandar N cantidad de parámetros en un solo objeto ;)
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(){...}
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"
xD 3 años despues... :) buen tutorial ^^
aunque haya pasado mucho tiempo estaria bueno que puedas hacer videos de los que falten, muchas gracias por los tutos igual ;D