Aprendiendo Ext JS 3

Herencia con ExtJS Más videos

Descripción del tema

Ya hablamos un poco acerca de la herencia con JavaScript, vimos como hacerla utilizando los prototipos, el día de hoy quiero mostrar una manera muy elegante utilizando ExtJS para crear nuestras propias “clases” (prototipos, en JS no existen las clases) , componentes o extender de algún Panel, Ventana o lo que necesitemos. Es necesario que comprendamos que en JavaScript no existe como tal el concepto de “clase”, en JS utilizamos “prototipos” de los cuales generamos instancias, también podemos extenderlos utilizando la “herencia de prototipo”, la manera de hacerlo es muy sencilla pero es un poco laboriosa. ExtJS nos provee de una utilería que nos hace la vida muchas más sencilla, mediante el método “Ext.extend” podemos crear “clases” (prototipos) de una manera muy elegante y luego podemos extenderlos para crear otras “clases” (prototipos) y reutilizar nuestro código las veces que necesitemos. Podemos crear un prototipo de dos formas principales, y las analizaremos por separado.

Crear prototipos a la manera antigua

Este método era propio de la versión 1.0 de ExtJS, esta era la manera de crear nuestros prototipos (clases), primero crear la función constructora y luego utilizar Ext.extend para terminar de crear el prototipo.
Ext.ns("com.quizzpot.tutorial");				// Step 1

com.quizzpot.tutorial.Person = function(options){	//Step 2
	Ext.apply(this,options || {});			//Step 3
	
	console.debug("Person constructor!");
	
};
En el paso uno creamos el namespace que usará nuestro prototipo (clase), ya vimos las ventajas de hacerlo y porqué es necesario. En el paso dos creamos la función constructora, esta función se ejecutará cada que se cree una instancia de nuestro prototipo, aquí podemos hacer todo lo que necesitemos para inicializar el nuevo objeto. En el paso tres solamente estamos aplicando las opciones que el usuario definió para la nueva instancia, la idea de esto es que podamos cambiar las configuraciones por defecto de cada objeto. Una vez que tenemos definido nuestro constructor podemos asignarle las propiedades y métodos que tendrá nuestro prototipo.
com.quizzpot.tutorial.Person = Ext.extend(com.quizzpot.tutorial.Person,{ 	//Step 1
	username	: "none",			//Step 2
	email		: "none",
	name		: "none",
	startTime	: new Date(),
	endTime		: new Date(),
	
	checkIn		: function(){			//Step 3
		this.startTime = new Date();
	},
	
	checkOut	: function(){
		this.endTime = new Date();
	},
	
	workingHours: function(){
		return (this.endTime - this.startTime)/1000;
	}
	
});
En el paso uno hacemos uso del método “Ext.extend”, este método toma como primer argumento el objeto al cual queremos extender, en este caso a la función constructora solamente, pero podría ser cualquier otro componente que deseemos extender, el segundo parámetro es un objeto con el código que deseamos agregar o sobre escribir, en otras palabras la “subclase” (¿subprototipo? ¡objeto!), el método Ext.extend regresa un nuevo prototipo que contiene los método de la superclase (el prototipo original) y los métodos y propiedades del objeto nuevo. En el paso dos solamente creamos unas propiedades, estas serán agregadas al prototipo de nuestro nuevo objeto. En el paso tres creamos unos métodos.

Crear instancias del prototipo

Una vez que tenemos nuestro prototipo listo podemos crear instancias de él muy fácilmente:
var crysfel = new com.quizzpot.tutorial.Person({	//Step 1
	username	: "crysfel",
	email		: "crysfel@dominio.com",
	name		: "Crysfel Villa"
});

crysfel.checkIn();					//Step 2
setTimeout(function(){
	crysfel.checkOut();
	var time = crysfel.workingHours();
	console.debug(time+" seconds working!");	//Step 3
},3000);
En el paso uno creamos una instancia del prototipo utilizando el operador “new”, podríamos crear todas las que necesitemos cambiando sus configuraciones. En el paso dos ejecutamos uno de los métodos de la instancia. En el paso tres se imprime la cantidad de segundos transcurridos entre la hora de entrada y la hora de salida. Como puedes ver es muy sencillo crear prototipos utilizando Ext.extend, ahora vamos a ver otra forma de hacer lo mismo pero un poco más elegante. Crear prototipos con la nueva versión ExtJS mejoró la manera de crear prototipos en la versión 2.x, en esta versión ya no es necesario crear una función constructora y luego extenderla, simplemente utilizamos la propiedad “constructor” y extendemos de Object.
Ext.ns("com.quizzpot.tutorial");

com.quizzpot.tutorial.Person = Ext.extend(Object,{	//Step 1
	username	: "none",
	email		: "none",
	name		: "none",
	startTime	: new Date(),
	endTime		: new Date(),
	
	constructor	: function(options){	//Step 2
		Ext.apply(this,options || {});
	
		console.debug("Person constructor!");
	},
	
	checkIn		: function(){
		this.startTime = new Date();
	},
	
	checkOut	: function(){
		this.endTime = new Date();
	},
	
	workingHours: function(){
		return (this.endTime - this.startTime)/1000;
	}
	
});
En el paso uno extendemos directamente de Object quien es el padre de todos los objetos, es importante mencionar que el método “Ext.extend” no modifica la superclase (superprototipo), sino que regresa un nuevo objeto tomando la super clase y añadiéndole las propiedades y métodos de loa subclase. En el paso dos definimos el constructor de la clase (prototipo) y ahí alojamos el código que se ejecutará cuando se creen nuevas instancias. Personalmente me gusta mucho esta nueva manera de hacer prototipos, es muy fácil y el código se lee muy bien, además de que nos evita la fatiga de asignar nosotros mismos cada propiedad y método al “prototype” de nuestro objeto.

Sobre escritura de métodos

Hasta ahorita hemos creado un solo prototipo, lo que haremos ahora es extenderlo para crear uno nuevo y sobre escribir algunos métodos.
com.quizzpot.tutorial.Employee = Ext.extend(com.quizzpot.tutorial.Person,{	//Step 1
	position		: "Jr. Programmer",
	technicalSkills	: ["JavaScript","Ext JS","XHTML/CSS","Java"],
	tasks			: [],
	
	constructor		: function(options){				//Strep 2
		console.debug("Employee constructor!");

		com.quizzpot.tutorial.Employee.superclass.constructor.call(this);//Step 3
		
	},
	
	checkOut	: function(){
		com.quizzpot.tutorial.Employee.superclass.checkOut.call(this); //Step 4
		this.endTime.setHours(18);
		return this.endTime;
	},
	
	workingHours	: function(){
		var seconds = com.quizzpot.tutorial.Employee.superclass.workingHours.call(this);
		return seconds/3600;
	},
	
	assignTask		: function(task){
		this.tasks.push(task);
	}
});
En el paso uno utilizamos el método Ext.extend para extender de la clase (prototipo) “Person” e iniciamos a escribir el código para la subclase “Employee”. En el paso dos creamos el constructor de “Employee” utilizando la propiedad “constructor” y automáticamente ExtJS creará la función constructora. El paso tres es muy importante, aquí estamos ejecutando el constructor de la superclase, de esta manera es como reutilizaremos el código que ya hemos escrito en la superclase. Es importante mencionar que ExtJS crea automáticamente un acceso a la superclase mediante la propiedad “superclass” la cual es insertada a cada instancia, luego nos referimos al método que necesitamos ejecutar en la superclase y simplemente lo ejecutamos en el contexto actual usando el método “call”. En el paso cuatro estamos sobre escribiendo el método “checkout” pero también ejecutamos el “checkout” de la superclase que es el que define la hora de salida, luego en la subclase le asignamos una hora diferente, en este caso las seis de la tarde. Podemos sobre escribir los métodos que necesitemos o bien crear nuevos métodos y propiedades para la subclase, ahora vamos a escribir la manera de crear instancias de la subclase:
var crysfel = new com.quizzpot.tutorial.Employee({
	username	: "crysfel",
	email		: "crysfel@dominio.com",
	name		: "Crysfel Villa"
});

crysfel.checkIn();
setTimeout(function(){
	crysfel.checkOut();
	var time = crysfel.workingHours();
	console.debug(time+" hours working!");
},3000);
Si ejecutas el ejemplo verás en la consola de de tu navegador algunos mensajes, nota como se ejecuta primero el constructor de la subclase y luego éste manda ejecutar el constructor de la superclase.

Conclusiones

ExtJS nos permite crear clases de una manera muy elegante, personalmente me agrada mucho esta manera ya que es muy entendible y fácil de realizar, en futuros tutoriales veremos cómo extender componentes de ExtJS para crear nuestras propias extensiones. Si te ha gustado este tutorial por favor compártelo en las redes sociales y ayúdanos a crecer para que podamos seguir financiando estos tutoriales de forma gratuita, recuerda seguirnos en Twitter o inscribirte al RSS.

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?

14Comentarios

  • Avatar-3 Andres Ballesteros Baltazar 26/02/2010

    hola quizzpot, gracias por los tutoriales están buenísimos y estoy aprendiendo mucho me alegra que haya gente como tú a disposición de otros tu explicación y método que utilizas es excelente. Sigue adelante... :)

    • Avatar-9 Peter Kellner 09/05/2010

      Well, I can sort of understand the spanish, but the content is great!!!

      • Avatar-2 Crysfel 12/05/2010

        Thanks :)

        • Avatar-10 Santiago 12/06/2010

          Felicitaciones por el éxito que estas teniendo con Quizzpot, los tutoriales son excelentes ! Pregunta: Usando el Ext Designer he visto que cuando creas un JsonStore, por ejemplo, este hace una extensión del mismo, pero en los ejemplos que has mostrado y los que están en internet siempre lo construyen con un new. Hay algún motivo en particular (ventajas) por el cual se haga una extensión ? Tal vez para poder pasar como parámetro la configuración ? Saludos !

          • Avatar-7 Zesar 18/07/2010

            gracias Crysfel, ya leí, ahora haré pruebas

            • Avatar-7 Alex 11/08/2010

              Pregunta: no se si se relaciona con este tema pero es lo siguiente: tengo un grid que es un catalogo conectado a la base de datos postgresql funciona perfectamente, los php los deje que reciban parametros de extjs en metodo post para que de forma dinamica eljan la tabla y campos tanto para lectura como escritura, ya esta y funciona. yo empiezo con extjs y lo que no se hacer es lo siguiente: van a ser varios catalogos uno en cada panel, no le veo caso copiar el archivo js y duplicar el codigo, cambiar la tabla y campos en cada archivo para cada catalogo. quiero enviar parametros (tabla y campos) desde cada panel al grid y usar un solo codigo del grid para todos los catalogos simplemente enviarle al grid estos valores al fin de cuentas para todos es el mismo comportamiento pero no se como enviar estas variables al grid.

              • Avatar-4 Juan 13/08/2010

                Hola. Felicitaciones,muy buen tutorial! Hay alguna forma de implementar herencia multiple con ext? tengo una clase A, y una clase B, de jerarquias diferentes. Quisiera que mi nueva clase C heredara de ambas. Hay forma de hacer esto? gracias!

                • Avatar-9 ShinSeiki 01/09/2010

                  Bueno, la pregunta de Alex responderia muy claramente a la pregunta de Santiago. Alex, tendrias que hacer extenciones para poder utilizar lo que necesitas. salu2

                  • Avatar-3 pablo 03/02/2011

                    Estimado Crysfel estoy muy agradecido por tu aporte lo cual no hace sino fomentar la solidaridad y el buen compartir . Tengo una pregunta: porque dices en el encabezado de este tema "en JS no existen las clases" o el concepto de clases. segun wikipedia la creacion de clases es posible : http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_JavaScript_/_OOP para ser honesto estoy confundio pues soy nuevo en esto de Js y quisiera tener una base solida para mis conocimientos... desde ya muchisimas gracias amigo.

                    • Avatar-12 Crysfel 03/02/2011

                      En JavaScript se le denomina "Prototipo" el cual podríamos compararlo con una "clase".

                      • Avatar-4 Mlaynes 12/07/2011

                        Como siempre importante este aporte respecto al concepto de Herencia Herencia y de Extensiones con ExtJs... conceptos que debemos volver a revisar con bastante cuidado para adecuar nuestros propios aplicativos y extensiones ahora con ExtJs-4.x ..pues varios cambios de funciones básicas a este nivel ha habido (createDelegate -> Ext.bind, StoreMgr ->data.StoreManager, Models, MVC, etc, etc...) Regards..

                        • Avatar-8 Mlaynes 12/07/2011

                          ...son ahora los métodos Ext.define y Ext.create de ExtJs-4.x nuevas modalidades de "constructores" con que ahora "extendemos" las clases o prototipos básicos que componen ExtJs para utilizarlos en nuestros códigos..?

                          • Avatar-12 Maria Chavira 03/06/2015

                            Hola Crysfel! muy buen tutorial. Tengo una pregunta con respecto al metodo extend de los componentes; por qué al crear un componente heredado de otro componente extjs no puedo hacer el uso de algunos métodos del componente padre, como es el caso del metodo getXType() pues al ejecutar este método de mi componente personalizado me devuelve un undefained? Gracias por tu respuesta

                            • Avatar-4 Crysfel Villa 04/06/2015

                              En teoría si deberías poder hacerlo, posiblemente estás haciendo algo mal al realizar la herencia. Si sobre-escribes el constructor asegurate de llamar al super.

                            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.