SlideShare una empresa de Scribd logo
1 de 9
Programación orientada a objetos (OOP) con JavascriptClases vs prototipos JS es basado en prototípos. Un prototípo es un objeto abstracto, capaz de contener otros objetos dentro, los cuales pueden ser distintos tipos de datos: variables (numeros, cadenas de texto, valores lógicos), vectores, funciones e inclusive otros grupos de objetos. Entonces, en vez de programar una clase, para estar orientados a objetos en JS definimos un prototípo. Las variables dentro de este serán las propiedades, y las funciones serán los métodos: [Objeto = Prototípo]{      [ Propiedad = Variable ]      [ Método = Funcion ]  }
Creación del objeto La creación de un objeto se hace con una función, que será la constructora, y a la vez la que identifique el objeto. Hay dos formas de definir la función constructora: Definir una función o definir una variable cuyo contenido sea una función. Puede parecer redundante, lo es. Veamos ambas formas: Definir una función functionGato( parametros ) {       // Codigo   }; Definir una variable cuyo contenido sea una función. var Gato = function (parametros) {     /* Codigo*/  }
Propiedades del objeto Las propiedades del objeto se definen en forma de variables. Estas variables deben estar situadas dentro de la función constructora, marcadas con "this", para poder ser accesadas como parte del objeto. Las variables reciben parámetros que se envían al crear una nueva instancia del objeto. Por ejemplo: var Gato = function (nombre, color, edad) {  		    this.nombre = nombre;      this.color = color;     		    this.edad = edad;  	} Usando un objeto vamos a crear un gato nuevo, y a asignarle las propiedades: var Michi = new Gato("Michifu", "azul", 2); Si queremos comprobar alguna de las propiedades de nuestro objeto lo haríamos así:	 Variable_que_define_el_objeto (punto) propiedad_deseada. Por lo tanto: alert("El gato es de color "+Michi.color); 	Lo que nos da el resultado: "El gato es de color azul";
Métodos Un método es una función dentro del objeto. Hay varios formas de crear un método nuevo: Extendiendo el prototipo, creando una variable tipo función, o vinculando una función externa al objeto. Método 1: Vinculación externa Con este método declaramos que una de las propiedades, llamará a una función externa: 	[...]  this.comer = comerExterna;  	[...]  functioncomerExterna() {      		alert("El gato "+this.nombre+" se comió un ratón"); } 	 [...]  Michi.comer();  	[ Salida = "El gato Michifu se comió un ratón" ] Método 2: Extensión del prototipo Como los objetos están compuestos por prototipos en JavaScript, nosotros podemos aumentarle métodos al prototipo del objeto directamente, de la siguiente manera: 	//[ No tocamos la funcion constructora ]  Gato.prototype.comer = function() {      alert("El gato "+this.nombre+" se comió un ratón"); } 	 //[...] Michi.comer(); 	 //[ Salida = "El gato Michifu se comió un ratón" ] 
Método 3: Definición en la función constructora Con este método, asignamos una propiedad como función dentro de la constructora: //[...]  	this.comer = function() {    		alert("El gato "+this.nombre+" se comió un ratón");  	}  	//[...]  	Michi.comer();  	//[ Salida = "El gato Michifu se comió un ratón" ]  Nótese que en los tres métodos, es posible pasar parámetros a la función de la manera normal en que cualquier función trabaja. Además, en cualquiera de los métodos, this se refiere al objeto (en este caso Gato).
Herencia La herencia de métodos / propiedades. En JavaScript lo podemos lograr mediante los prototipos. Ahora, crearemos una raza de gato, la raza Siamés. Entonces creemos dos constructoras apartes para cada una, y hagamos que siamés herede de gato: var Gato = function () {  	    	this.ojos = 2;      this.piernas = 4;}  varSiames = function () {      this.color = "blanco";      this.color_ojos = "azul"; }	  //Como vemos, ambos tienen propiedades distintas. Ahora, heredemos:  Siames.prototype = new Gato();  	//Eso hace que se copie el prototipo de Gato y se añada al de Siames. Probemos : varCatboy = new Siames();  alert(Catboy.ojos);  	//Retorna 2! ^_^  alert(Catboy.color);  	//Retorna "blanco", asi que conserva sus propiedades 
Métodos y propiedades privadas Los métodos y funciones eran totalmente públicos: Modificables y legibles desde cualquier parte. Como "privatizar" variables: var Gato = function (nombre) { this.nombre = nombre;        	//Creamos una variable privada sin asignarle "this" a esta:       	var frecuencia = "moderada";  	// Creamos un método privado en muchos aspectos definiendo una 	función normal          function irAlBanio(frecuencia) {          		alert("El gato va al baño con frecuencia "+frecuencia);      		} irAlBano(frecuencia); } var Michin = new Gato("Michifu"); El código anterior crea la variable privada "frecuencia", y la función privada "irAlBanio". Para comprobar que la variable sea privada ejecutemos : 	alert(Michin.frecuencia), lo que devuelve: undefined
Sin embargo, aun podemos usar esas variables o funciones tanto en la función constructora, simplemente son funciones que nos permiten leer las propiedades: var Gato = function (nombre) {      this.nombre = nombre;      		//Creamos una variable privada sin asignarle "this" a esta:      		var frecuencia = "moderada";      		// Creamos un método privado en muchos aspectos definiendo 		una funcion  normal:      function irAlBano(frecuencia) {          			alert("El gato va al baño con frecuencia 					"+frecuencia); 		}      //Es aquí donde accedo a mi propiedad privada: this.leerFrec = function() {          			irAlBano(frecuencia);      		}  	}  var Michin = new Gato("Michifu"); 	 Michin.leerFrec();  	//Nos retorna "El gato va al baño con frecuencia moderada" ;)
Extensión de objetos nativos mediante el prototipo Como todos los objetos de JavaScript tienen prototipo, podemos añadir utilidades a nuestros objetos de siempre. Por ejemplo añadiendo una función a Array: Array.prototype.coincidencias = function(palabra){  		//array es nuestra nueva propiedad, que le añadimos a nuestra función coincidencias      		 coincidencias = 0; 		for (i=0; i<this.length; i++) {          			if (this[i] == palabra){              				coincidencias++;          			}      		}      		alert("Se encontraron "+coincidencias+" coincidencia(s) de la 			palabra"); } 	// Podemos usar el array siguiente, (inicializamos con una lista inicializadora): clabbers = Array("Freddie", "Mx", "Neo_JP", "Zarzamora", "Ramm", "Fael");  	// O este: clabbers = Array("Freddie", "Mx", "Neo_JP", "Zarzamora", "Mx", "Mx");  	//Y luego: clabbers.coincidencias("Mx");  	//Entonces la función nos notificará cuantas veces esta una palabra en un array.

Más contenido relacionado

La actualidad más candente

La actualidad más candente (16)

Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Jyoc java-cap08 principios poo
Jyoc java-cap08 principios pooJyoc java-cap08 principios poo
Jyoc java-cap08 principios poo
 
La propiedad prototype en la programación orientada a objetos con JavaScript
La propiedad prototype en la programación orientada a objetos con JavaScriptLa propiedad prototype en la programación orientada a objetos con JavaScript
La propiedad prototype en la programación orientada a objetos con JavaScript
 
Unidad 3: Herencia Ejercicio 1
Unidad 3: Herencia Ejercicio 1Unidad 3: Herencia Ejercicio 1
Unidad 3: Herencia Ejercicio 1
 
02 curso poo Clase - Objeto
02 curso poo Clase - Objeto02 curso poo Clase - Objeto
02 curso poo Clase - Objeto
 
03 curso poo Valores por defecto - constructores
03 curso poo Valores por defecto - constructores03 curso poo Valores por defecto - constructores
03 curso poo Valores por defecto - constructores
 
POO
POOPOO
POO
 
Macros en excel [106 paginas en español]
Macros en excel [106 paginas   en español]Macros en excel [106 paginas   en español]
Macros en excel [106 paginas en español]
 
Programar Macros
Programar MacrosProgramar Macros
Programar Macros
 
Herencia clase
Herencia claseHerencia clase
Herencia clase
 
Atributos
AtributosAtributos
Atributos
 
Elementos de una clase
Elementos de una claseElementos de una clase
Elementos de una clase
 
Introducción a la Programaciónen Java
Introducción a la Programaciónen JavaIntroducción a la Programaciónen Java
Introducción a la Programaciónen Java
 
Semana 4 Javascript Estructura de Datos y ciclo FOR
Semana 4   Javascript Estructura de Datos y ciclo FORSemana 4   Javascript Estructura de Datos y ciclo FOR
Semana 4 Javascript Estructura de Datos y ciclo FOR
 
04 curso poo Herencia
04 curso poo Herencia04 curso poo Herencia
04 curso poo Herencia
 
05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos05. Creando e implementando objetos y métodos
05. Creando e implementando objetos y métodos
 

Destacado

Reporte alertas 042011
Reporte alertas 042011Reporte alertas 042011
Reporte alertas 042011contacto hoy
 
2010: 365 días (y noches) de Marketing 2.0. El inicio de la e-década
2010: 365 días (y noches) de Marketing 2.0. El inicio de la e-década2010: 365 días (y noches) de Marketing 2.0. El inicio de la e-década
2010: 365 días (y noches) de Marketing 2.0. El inicio de la e-décadaJuan Merodio
 
Redes Sociales para mejorar la producción periodística
Redes Sociales para mejorar la producción periodísticaRedes Sociales para mejorar la producción periodística
Redes Sociales para mejorar la producción periodísticaJuan Carlos Luján Zavala
 
OOP-JS pjs
OOP-JS pjsOOP-JS pjs
OOP-JS pjsJona Val
 
Ovtt by Sofia Oliveira Pires
Ovtt by Sofia Oliveira PiresOvtt by Sofia Oliveira Pires
Ovtt by Sofia Oliveira PiresOVTT
 
Listen. Presentación de la fase Listen del modelo Sharing Brands
Listen. Presentación de la fase Listen del modelo Sharing BrandsListen. Presentación de la fase Listen del modelo Sharing Brands
Listen. Presentación de la fase Listen del modelo Sharing BrandsSharing Brands
 
Estrategia de Comunicación Digital para la Gestiòn Pùblica
Estrategia de Comunicación Digital para la Gestiòn PùblicaEstrategia de Comunicación Digital para la Gestiòn Pùblica
Estrategia de Comunicación Digital para la Gestiòn PùblicaJuan Carlos Luján Zavala
 
Cómo cuidar a mi hijo de los peligros en Internet
Cómo cuidar a mi hijo de los peligros en InternetCómo cuidar a mi hijo de los peligros en Internet
Cómo cuidar a mi hijo de los peligros en InternetJuan Carlos Luján Zavala
 

Destacado (12)

Reporte alertas 042011
Reporte alertas 042011Reporte alertas 042011
Reporte alertas 042011
 
Facebook
FacebookFacebook
Facebook
 
2010: 365 días (y noches) de Marketing 2.0. El inicio de la e-década
2010: 365 días (y noches) de Marketing 2.0. El inicio de la e-década2010: 365 días (y noches) de Marketing 2.0. El inicio de la e-década
2010: 365 días (y noches) de Marketing 2.0. El inicio de la e-década
 
Redes Sociales para mejorar la producción periodística
Redes Sociales para mejorar la producción periodísticaRedes Sociales para mejorar la producción periodística
Redes Sociales para mejorar la producción periodística
 
OOP-JS pjs
OOP-JS pjsOOP-JS pjs
OOP-JS pjs
 
Ovtt by Sofia Oliveira Pires
Ovtt by Sofia Oliveira PiresOvtt by Sofia Oliveira Pires
Ovtt by Sofia Oliveira Pires
 
Propuesta am china
Propuesta am chinaPropuesta am china
Propuesta am china
 
Listen. Presentación de la fase Listen del modelo Sharing Brands
Listen. Presentación de la fase Listen del modelo Sharing BrandsListen. Presentación de la fase Listen del modelo Sharing Brands
Listen. Presentación de la fase Listen del modelo Sharing Brands
 
Scopus
ScopusScopus
Scopus
 
Estrategia de Comunicación Digital para la Gestiòn Pùblica
Estrategia de Comunicación Digital para la Gestiòn PùblicaEstrategia de Comunicación Digital para la Gestiòn Pùblica
Estrategia de Comunicación Digital para la Gestiòn Pùblica
 
Cómo cuidar a mi hijo de los peligros en Internet
Cómo cuidar a mi hijo de los peligros en InternetCómo cuidar a mi hijo de los peligros en Internet
Cómo cuidar a mi hijo de los peligros en Internet
 
Ece 2014 región_ica
Ece 2014 región_icaEce 2014 región_ica
Ece 2014 región_ica
 

Similar a OOP.JAVAS pjs

Intro aplicaciones web con php
Intro aplicaciones web con phpIntro aplicaciones web con php
Intro aplicaciones web con phpFer Nando
 
Todo lo que un desarrollador no puede desconocer de javascript tutorial j q...
Todo lo que un desarrollador no puede desconocer de javascript   tutorial j q...Todo lo que un desarrollador no puede desconocer de javascript   tutorial j q...
Todo lo que un desarrollador no puede desconocer de javascript tutorial j q...Marcelino Ortiz
 
Introducción a la Programación con Javascript. Clase 3
Introducción a la Programación con Javascript. Clase 3Introducción a la Programación con Javascript. Clase 3
Introducción a la Programación con Javascript. Clase 3xjordi
 
Encapsulamiento
EncapsulamientoEncapsulamiento
Encapsulamientoluis0145
 
3 desarollo manejo datos capitulo 4 -01 introduccion colecciones
3 desarollo manejo datos capitulo 4 -01 introduccion colecciones3 desarollo manejo datos capitulo 4 -01 introduccion colecciones
3 desarollo manejo datos capitulo 4 -01 introduccion coleccionesluis freddy
 
Todo Javascript para canibales
Todo Javascript para canibalesTodo Javascript para canibales
Todo Javascript para canibalesbriant pati
 
Javascript de Canibales
Javascript de CanibalesJavascript de Canibales
Javascript de Canibalesbriant pati
 
Java Script de canibaless
Java Script de canibalessJava Script de canibaless
Java Script de canibalessbriant pati
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxssuser2e6b96
 
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetosluis freddy
 
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
3 desarollo manejo datos capitulo 4 -02 aplicaciones coleccionesluis freddy
 
programacion orientada a objetos
programacion orientada a objetosprogramacion orientada a objetos
programacion orientada a objetosjent46
 
Java paratodos1
Java paratodos1Java paratodos1
Java paratodos1alvriveros
 

Similar a OOP.JAVAS pjs (20)

Intro aplicaciones web con php
Intro aplicaciones web con phpIntro aplicaciones web con php
Intro aplicaciones web con php
 
Javascript OOP
Javascript OOPJavascript OOP
Javascript OOP
 
Todo lo que un desarrollador no puede desconocer de javascript tutorial j q...
Todo lo que un desarrollador no puede desconocer de javascript   tutorial j q...Todo lo que un desarrollador no puede desconocer de javascript   tutorial j q...
Todo lo que un desarrollador no puede desconocer de javascript tutorial j q...
 
Introducción a la Programación con Javascript. Clase 3
Introducción a la Programación con Javascript. Clase 3Introducción a la Programación con Javascript. Clase 3
Introducción a la Programación con Javascript. Clase 3
 
Javascript objetos
Javascript objetosJavascript objetos
Javascript objetos
 
4 manejo de_metodos
4 manejo de_metodos4 manejo de_metodos
4 manejo de_metodos
 
Encapsulamiento
EncapsulamientoEncapsulamiento
Encapsulamiento
 
Guia poo
Guia pooGuia poo
Guia poo
 
3 desarollo manejo datos capitulo 4 -01 introduccion colecciones
3 desarollo manejo datos capitulo 4 -01 introduccion colecciones3 desarollo manejo datos capitulo 4 -01 introduccion colecciones
3 desarollo manejo datos capitulo 4 -01 introduccion colecciones
 
Jquery parte 1
Jquery parte 1Jquery parte 1
Jquery parte 1
 
Todo Javascript para canibales
Todo Javascript para canibalesTodo Javascript para canibales
Todo Javascript para canibales
 
Javascript de Canibales
Javascript de CanibalesJavascript de Canibales
Javascript de Canibales
 
Java Script de canibaless
Java Script de canibalessJava Script de canibaless
Java Script de canibaless
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docx
 
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos
3 desarollo manejo datos capitulo 3 -02 busqueda arreglo objetos
 
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
3 desarollo manejo datos capitulo 4 -02 aplicaciones colecciones
 
programacion orientada a objetos
programacion orientada a objetosprogramacion orientada a objetos
programacion orientada a objetos
 
Java paratodos1
Java paratodos1Java paratodos1
Java paratodos1
 
Lab herencia
Lab herenciaLab herencia
Lab herencia
 
Modulo ii de_java[1]
Modulo ii de_java[1]Modulo ii de_java[1]
Modulo ii de_java[1]
 

OOP.JAVAS pjs

  • 1. Programación orientada a objetos (OOP) con JavascriptClases vs prototipos JS es basado en prototípos. Un prototípo es un objeto abstracto, capaz de contener otros objetos dentro, los cuales pueden ser distintos tipos de datos: variables (numeros, cadenas de texto, valores lógicos), vectores, funciones e inclusive otros grupos de objetos. Entonces, en vez de programar una clase, para estar orientados a objetos en JS definimos un prototípo. Las variables dentro de este serán las propiedades, y las funciones serán los métodos: [Objeto = Prototípo]{      [ Propiedad = Variable ]      [ Método = Funcion ] }
  • 2. Creación del objeto La creación de un objeto se hace con una función, que será la constructora, y a la vez la que identifique el objeto. Hay dos formas de definir la función constructora: Definir una función o definir una variable cuyo contenido sea una función. Puede parecer redundante, lo es. Veamos ambas formas: Definir una función functionGato( parametros ) {       // Codigo  }; Definir una variable cuyo contenido sea una función. var Gato = function (parametros) {     /* Codigo*/ }
  • 3. Propiedades del objeto Las propiedades del objeto se definen en forma de variables. Estas variables deben estar situadas dentro de la función constructora, marcadas con "this", para poder ser accesadas como parte del objeto. Las variables reciben parámetros que se envían al crear una nueva instancia del objeto. Por ejemplo: var Gato = function (nombre, color, edad) {     this.nombre = nombre;      this.color = color;      this.edad = edad; } Usando un objeto vamos a crear un gato nuevo, y a asignarle las propiedades: var Michi = new Gato("Michifu", "azul", 2); Si queremos comprobar alguna de las propiedades de nuestro objeto lo haríamos así: Variable_que_define_el_objeto (punto) propiedad_deseada. Por lo tanto: alert("El gato es de color "+Michi.color); Lo que nos da el resultado: "El gato es de color azul";
  • 4. Métodos Un método es una función dentro del objeto. Hay varios formas de crear un método nuevo: Extendiendo el prototipo, creando una variable tipo función, o vinculando una función externa al objeto. Método 1: Vinculación externa Con este método declaramos que una de las propiedades, llamará a una función externa: [...] this.comer = comerExterna; [...] functioncomerExterna() {       alert("El gato "+this.nombre+" se comió un ratón"); } [...] Michi.comer(); [ Salida = "El gato Michifu se comió un ratón" ] Método 2: Extensión del prototipo Como los objetos están compuestos por prototipos en JavaScript, nosotros podemos aumentarle métodos al prototipo del objeto directamente, de la siguiente manera: //[ No tocamos la funcion constructora ] Gato.prototype.comer = function() {      alert("El gato "+this.nombre+" se comió un ratón"); } //[...] Michi.comer(); //[ Salida = "El gato Michifu se comió un ratón" ] 
  • 5. Método 3: Definición en la función constructora Con este método, asignamos una propiedad como función dentro de la constructora: //[...] this.comer = function() {    alert("El gato "+this.nombre+" se comió un ratón"); } //[...] Michi.comer(); //[ Salida = "El gato Michifu se comió un ratón" ]  Nótese que en los tres métodos, es posible pasar parámetros a la función de la manera normal en que cualquier función trabaja. Además, en cualquiera de los métodos, this se refiere al objeto (en este caso Gato).
  • 6. Herencia La herencia de métodos / propiedades. En JavaScript lo podemos lograr mediante los prototipos. Ahora, crearemos una raza de gato, la raza Siamés. Entonces creemos dos constructoras apartes para cada una, y hagamos que siamés herede de gato: var Gato = function () {      this.ojos = 2;      this.piernas = 4;} varSiames = function () {      this.color = "blanco";      this.color_ojos = "azul"; } //Como vemos, ambos tienen propiedades distintas. Ahora, heredemos: Siames.prototype = new Gato(); //Eso hace que se copie el prototipo de Gato y se añada al de Siames. Probemos : varCatboy = new Siames(); alert(Catboy.ojos); //Retorna 2! ^_^ alert(Catboy.color); //Retorna "blanco", asi que conserva sus propiedades 
  • 7. Métodos y propiedades privadas Los métodos y funciones eran totalmente públicos: Modificables y legibles desde cualquier parte. Como "privatizar" variables: var Gato = function (nombre) { this.nombre = nombre;        //Creamos una variable privada sin asignarle "this" a esta:      var frecuencia = "moderada"; // Creamos un método privado en muchos aspectos definiendo una función normal          function irAlBanio(frecuencia) {          alert("El gato va al baño con frecuencia "+frecuencia);      } irAlBano(frecuencia); } var Michin = new Gato("Michifu"); El código anterior crea la variable privada "frecuencia", y la función privada "irAlBanio". Para comprobar que la variable sea privada ejecutemos : alert(Michin.frecuencia), lo que devuelve: undefined
  • 8. Sin embargo, aun podemos usar esas variables o funciones tanto en la función constructora, simplemente son funciones que nos permiten leer las propiedades: var Gato = function (nombre) {      this.nombre = nombre;      //Creamos una variable privada sin asignarle "this" a esta:      var frecuencia = "moderada";      // Creamos un método privado en muchos aspectos definiendo una funcion normal:      function irAlBano(frecuencia) {          alert("El gato va al baño con frecuencia "+frecuencia); }      //Es aquí donde accedo a mi propiedad privada: this.leerFrec = function() {          irAlBano(frecuencia);      } } var Michin = new Gato("Michifu"); Michin.leerFrec(); //Nos retorna "El gato va al baño con frecuencia moderada" ;)
  • 9. Extensión de objetos nativos mediante el prototipo Como todos los objetos de JavaScript tienen prototipo, podemos añadir utilidades a nuestros objetos de siempre. Por ejemplo añadiendo una función a Array: Array.prototype.coincidencias = function(palabra){ //array es nuestra nueva propiedad, que le añadimos a nuestra función coincidencias      coincidencias = 0; for (i=0; i<this.length; i++) {          if (this[i] == palabra){              coincidencias++;          }      }      alert("Se encontraron "+coincidencias+" coincidencia(s) de la palabra"); } // Podemos usar el array siguiente, (inicializamos con una lista inicializadora): clabbers = Array("Freddie", "Mx", "Neo_JP", "Zarzamora", "Ramm", "Fael"); // O este: clabbers = Array("Freddie", "Mx", "Neo_JP", "Zarzamora", "Mx", "Mx"); //Y luego: clabbers.coincidencias("Mx"); //Entonces la función nos notificará cuantas veces esta una palabra en un array.