Blog

ExtJS and Sencha Touch Themes and Templates

Herencia con ExtJS

Feb 25, 2010 | Español | By | 12 Comments

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.

Herencia con ExtJS
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

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.

12 Responses to “Herencia con ExtJS”

  • 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… :)

  • Peter Kellner May 09, 2010

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

  • Santiago Jun 12, 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 !

  • Zesar Jul 18, 2010

    gracias Crysfel, ya leí, ahora haré pruebas

  • Alex Aug 11, 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.

    • ShinSeiki Sep 01, 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

  • Juan Aug 13, 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!

  • pablo Feb 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.

    • Crysfel Feb 02, 2011

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

  • Mlaynes Jul 11, 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..

  • Mlaynes Jul 12, 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..?

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!