martes, 16 de diciembre de 2014

Parte 4: Los objetos del navegador: DOM de la página

4.1 Jerarquía de objetos del navegador

Los objetos que están disponibles en Javascript para controlar cualquier elemento presente en la página web.

Cuando se carga una página, el navegador crea una jerarquía de objetos en memoria que sirven para controlar los distintos
elementos de dicha página. Con Javascript y la nomenclatura de objetos que hemos aprendido, podemos trabajar con esa 
jerarquía de objetos, acceder a sus propiedades e invocar sus métodos.


4.1.1 Ejemplo de acceso a la jerarquía

Vamos a ver el ejemplo típico de acceso a una propiedad de esta jerarquía para cambiar el aspecto de la página. Se trata de una propiedad de la página que almacena el color de fondo de la página web: la propiedad bgColor del objeto document. 

document.bgColor = "red"

Si ejecutamos esta sentencia en cualquier momento cambiamos el color de fondo de la página a rojo. En esta página definida con color de fondo blanco hemos cambiado esa propiedad luego con Javascript, por lo que saldrá con color de fondo rojo. 

<HTML> 
<HEAD> 
 <TITLE>Prueba bgColor</TITLE> 
</HEAD> 
<BODY bgcolor=white> 

<script> 
document.bgColor = "red" 
</script> 
</BODY> 
</HTML>

En los ejemplos que hemos visto hasta ahora también hemos hecho uso de los objetos de la jerarquía del navegador. En concreto hemos utilizado mucho el método write() del objeto document para escribir un texto en la página. 

document.write("El texto a escribir")



4.2 Trabajando con la Jerarquía en Javascript

El objeto window ofrece una serie de métodos y propiedades para controlar la ventana del navegador. Con ellos podemos controlar el aspecto de la ventana, la barra de estado, abrir ventanas secundarias y muchas otras cosas.

Además de ofrecer control, el objeto window da acceso a otros objetos como el documento (La página web que se está visualizando), el historial de páginas visitadas o los distintos frames de la ventana. De modo que para acceder a cualquier otro objeto de la jerarquía deberíamos empezar por el objeto window.

En los ejemplos incluidos en el capítulo anterior podíamos haber escrito también las sentencias de acceso a la jerarquía empezando por el objeto window, de esta manera. 

window.document.bgColor = "red" 
window.document.write("El texto a escribir")



4.2.1 Las propiedades de un objeto pueden ser a su vez otros objetos

Muchas de las propiedades del objeto window son a su vez otros objetos. Es el caso de objetos como el historial de páginas web o el objeto documento, que tienen a su vez otras propiedades y métodos. 

Entre ellos destaca el objeto document, que contiene todas las propiedades y métodos necesarios para controlar muchos aspectos de la página. Ya hemos visto alguna propiedad como bgColor, pero tiene muchas otras como el título de la página, las imágenes que hay incluidas, los formularios, etc.



4.2.2 Navegación a través de la jerarquía


Como ya dijimos, toda la jeraquía empieza en el objeto window, aunque no era necesario hacer referencia a window para acceder a cualquier objeto de la jerarquía. Luego en importancia está el objeto document, donde podemos encontrar alguna propiedad especial que son lo arrays, por ejemplo la propiedad images es un array con todas las imágenes de la página web. También encontramos arrays para guardar los enlaces de la página, los applets, los formularios y las anclas. 


Cuando una página se carga, el navegador construye en memoria la jerarquía de objetos. De manera adicional, construye también estos arrays de objetos. Por ejemplo, en el caso de las imágenes, va creando el array colocando en la posición 0 la primera imagen, en la posición 1 la segunda imagen y así hasta que las introduce todas. 

Vamos a ver un bucle que recorre todas las imágenes de la página e imprime su propiedad src, que contiene la URL donde está situada la imagen. 

for (i=0;i<document.images.length;i++){ 
 document.write(document.images[i].src) 
 document.write("<br>") 

Utilizamos la propiedad length del array images para limitar el número de iteraciones del bucle. Luego utilizamos el método write() del objeto document pasándole el valor de cada una de las propiedades src de cada imagen.

Ahora vamos a ver el uso de otro array de objetos. En este caso vamos a acceder un poco más dentro de la jerarquía para llegar a la matriz elements de los objetos formulario, que contiene cada uno de los elementos que componen el formulario.

Para ello tendremos que acceder a un formulario de la página, al que podremos acceder por el array de formularios, y dentro de él a la propiedad elements, que es otro array de objetos. Para cada elemento del formulario vamos a escribir su propiedad value, que corresponde con la propiedad value que colocamos en HTML.


f or (i=0;i<document.forms[0].elements.length;i++){ 
 document.write(document. forms[0].elements[i].value) 
 document.write("<br>") 

Es un bucle muy parecido al que teníamos para recorrer las imágenes, con la diferencia que ahora recorremos el vector de elements, al que accedemos por la jerarquía de objetos pasando por el array de formularios en su posición 0, que corresponde con el primer formulario de la página.



4.3 Objeto window de Javascript

Sirve para controlar la ventana del navegador.

Es el objeto principal en la jerarquía y contiene las propiedades y métodos para controlar la ventana del navegador.


4.3.1 Propiedades del objeto window


closed 

Indica la posibilidad de que se haya cerrado la ventana. (Javascript 1.1) 


defaultStatus
Texto que se escribe por defecto en la barra de estado del navegador. 

document
Objeto que contiene el la página web que se está mostrando. 

Frame
Un objeto frame de una página web. Se accede por su nombre. 

frames array
El vector que contiene todos los frames de la página. Se accede por su índice a partir de 0. 

history
Objeto historial de páginas visitadas. 

innerHeight
Tamaño en pixels del espacio donde se visualiza la página, en vertical. (Javascript 1.2) 

innerWidth
Tamaño en pixels del espacio donde se visualiza la página, en horizontal. (Javascript 1.2) 

length
Numero de frames de la ventana. 

location
La URL del documento que se está visualizando. Podemos cambiar el valor de esta propiedad para movernos a otra página.
Ver también la propiedad location del objeto document.

locationbar
Objeto barra de direcciones de la ventana. (Javascript 1.2) 

menubar
Objeto barra de menús de la ventana. (Javascript 1.2) 

name
Nombre de la ventana. Lo asignamos cuando abrimos una nueva ventana. 

opener
Hace referencia a la ventana de navegador que abrió la ventana donde estamos trabajando. Se verá con detenimiento en el tratamiento de ventanas con Javascript. 

outherHeight
Tamaño en pixels del espacio de toda la ventana, en vertical. Esto incluye las barras de desplazamiento, botones, etc.(Javascript 1.2) 

outherWidth
Tamaño en pixels del espacio de toda la ventana, en horizontal. Esto incluye las barras de desplazamiento. (Javascript 1.2) 

parent
Hace referencia a la ventana donde está situada el frame donde estamos trabajando. La veremos con detenimiento al estudiar el control de frames con Javascript. 

personalbar
Objeto barra personal del navegador. (Javascript 1.2) 

self
Ventana o frame actual. 

scrollbars
Objeto de las barras de desplazamiento de la ventana.

status
Texto de la barra de estado. 

statusbar
Objeto barra de estado del navegador. (Javascript 1.2) 

toolbar
Objeto barra de herramientas. (Javascript 1.2) 

top
Hace referencia a la ventana donde está situada el frame donde estamos trabajando. Como la propiedad parent. 

window
Hace referencia a la ventana actual, igual que la propiedad self.


Vamos a ver un ejemplo de utilización de la propiedad status del objeto window. Esta propiedad sirve para escribir un texto en la barra de estado del navegador (la barra de debajo de la ventana). En este ejemplo utilizamos el manejador de eventos onclick, que sirve para ejecutar sentencias Javascript cuando el usuario pulsa un elemento de la página.

Los manejadores de eventos se colocan en etiquetas HTML, en nuestro caso lo colocamos en un botón de formulario. Las sentencias Javascript asociadas al evento onclick del botón se ejecutarán cuando pulsemos el botón.

Veamos ya el código que hace que se cambie el texto de la barra de estado cuando pulsemos un botón.

<form>
<input type="Button" value="Pulsame!" onclick="window.status='Hola a todo el mundo!'">
</form>

Simplemente asignamos un texto a la propiedad status del objeto window. El texto que colocamos en la barra de estado está escrito entre comillas simples porque estamos escribiendo dentro de unas comillas dobles.



4.4 Métodos de window en Javascript

El objeto window de Javascript tiene a disposición de los programadores una larga lista de métodos.

Métodos que tiene el objeto window:

alert(texto)
Presenta una ventana de alerta donde se puede leer el texto que recibe por parámetro 

back()
Ir una página atrás en el historial de páginas visitadas. Funciona como el botón de volver de la barra de herramientas.(Javascript 1.2) 

blur()
Quitar el foco de la ventana actual. (Javascript 1.1) 

captureEvents(eventos)
Captura los eventos que se indiquen por parámetro (Javascript 1.2). 

clearInterval()
Elimina la ejecución de sentencias asociadas a un intervalo indicadas con el método setInterval().(Javascript 1.2) 

clearTimeout()
Elimina la ejecución de sentencias asociadas a un tiempo de espera indicadas con el método setTimeout(). 

close()
Cierra la ventana. (Javascript 1.1) 

confirm(texto)
Muestra una ventana de confirmación y permite aceptar o rechazar. 

find()
Muestra una ventanita de búsqueda. (Javascript 1.2 para Netscape) 

focus()
Coloca el foco de la aplicación en la ventana. (Javascript 1.1) 

forward()
Ir una página adelante en el historial de páginas visitadas. Como si pulsásemos el botón de adelante del navegador.(Javascript 1.2) 

home()
Ir a la página de inicio que haya configurada en el explorador. (Javascript 1.2) 

moveBy(pixelsX, pixelsY)
Mueve la ventana del navegador los pixels que se indican por parámetro hacia la derecha y abajo. (Javascript 1.2) 

moveTo(pixelsX, pixelsY)
Mueve la ventana del navegador a la posición indicada en las coordenadas que recibe por parámetro. (Javascript 1.2) 

open()
Abre una ventana secundaria del navegador. Se puede aprender a utilizarla en el reportaje de cómo abrir ventanas secundarias. 

print()
Como si pulsásemos el botón de imprimir del navegador. (Javascript 1.2) 

prompt(pregunta,inicializacion_de_la_respuesta)
Muestra una caja de diálogo para pedir un dato. Devuelve el dato que se ha escrito. 

releaseEvents(eventos)
Deja de capturar eventos del tipo que se indique por parámetro. (Javascript 1.2) 

resizeBy(pixelsAncho,pixelsAlto)
Redimensiona el tamaño de la ventana, añadiendo a su tamaño actual los valores indicados en los parámetros. El primero para la altura y el segundo para la anchura. Admite valores negativos si se desea reducir la ventana. (Javascript 1.2) 

resizeTo(pixelsAncho,pixelsAlto)
Redimensiona la ventana del navegador para que ocupe el espacio en pixels que se indica por parámetro (Javascript 1.2) 

routeEvent()
Enruta un evento por la jerarquía de eventos. (Javascript 1.2) 

scroll(pixelsX,pixelsY)
Hace un scroll de la ventana hacia la coordenada indicada por parámetro. Este método está desaconsejado, pues ahora se debería utilizar scrollTo()(Javascript 1.1) 

scrollBy(pixelsX,pixelsY)
Hace un scroll del contenido de la ventana relativo a la posición actual. (Javascript 1.2) 

scrollTo(pixelsX,pixelsY)
Hace un scroll de la ventana a la posición indicada por el parámetro. Este método se tiene que utilizar en lugar de scroll.(Javascript 1.2) 

setInterval()
Define un script para que sea ejecutado indefinidamente en cada intervalo de tiempo. (Javascript 1.2) 

setTimeout(sentencia,milisegundos)
Define un script para que sea ejecutado una vez después de un tiempo de espera determinado. 

stop()
Como pulsar el botón de stop de la ventana del navegador. (Javascript 1.2) 

Para ilustrar un poco mejor el funcionamiento de alguno de estos métodos -los más extraños-, hemos creado una página web que los utiliza. El código de la página se muestra a continuación: 

<form> 
<input type="button" value="Ventana de búsqueda (Solo Netscape)" onClick="window.find()"> 
<br> 
<br> 
<input type="button" value="Mover la ventana 10 derecha,10 abajo" onClick="moveBy(10, 10)"> 
<br> 
<br> 
<input type="button" value="Mover la ventana al punto (100,10)" onClick="moveTo(100, 10)"> 
<br> 
<br> 
<input type="button" value="Imprimir esta página" onClick="print()"> 
<br> 
<br> 
<input type="button" value="Aumenta la ventana 10 ancho,10 largo" onClick="resizeBy(10, 10)"> 
<br> 
<br> 
<input type="button" value="Fija el tamaño de la ventana en 400 x 200" onClick="resizeTo(400, 200)">
<br> 
<br>
<input type="button" value="Scroll arriba del todo" onClick="scroll(0,0)"> 
<br> 
<br> 
<input type="button" value="Scroll arriba 10 pixels" onClick="scrollBy(0,-10)"> 
</form> 

Estos ejemplos son muy simples, aunque poco prácticos. Únicamente se trata de una serie de botones que, al pulsarlos, llaman a otros tantos métodos del objeto window. En el atributo onclick de la etiqueta del botón se indican las sentencias Javascript que queremos que se ejecuten cuando se pulsa sobre dicho botón.



4.5 Ejemplos de métodos de window

Ejemplos que sirven para sacar cajas de diálogo, que son muy útiles.


4.5.1 Caja de alerta 

Para sacar un texto en una ventanita con un botón de aceptar. Recibe el texto por parámetro. 

window.alert("Este es el texto que sale") 

Como el objeto window se sobreentiende podemos escribirlo así. 

alert("Este es el texto que sale")



4.5.2 Caja de confirmación

Muestra una ventana con un texto indicado por parámetro y un botón de aceptar y otro de rechazar. Dependiendo del botón que se pulsa devuelve un true (si se pulsa aceptar) o un false (si se pulsa rechazar). 

<script> 
var respuesta = confirm("Aceptame o rechazame") 
alert ("Has pulsado: " + respuesta) 
</script> 

Este script muestra una caja de diálogo confirm y luego muestra en otra caja de diálogo alert el contenido de la variable que devolvió la caja de diálogo.



4.5.3.- Caja de introducción de un dato

Muestra una caja de diálogo donde se formula una pregunta y hay un campo de texto para escribir una respuesta. El campo de texto aparece relleno con lo que se escriba en el segundo parámetro del método. También hay un botón de aceptar y otro de cancelar. En caso de pulsar aceptar, el método devuelve el texto que se haya escrito. Si se pulsó cancelar devuelve null. 

El ejemplo siguiente sirve para pedir el nombre de la persona que está visitando la página y luego mostrar en la página un saludo personalizado. Utiliza un bucle para repetir la toma de datos siempre que el nombre de la persona sea null (porque pulsó el botón de cancelar) o sea un string vacío (porque no escribió nada). 

<script> 
nombre = null 
while (nombre == null || nombre == ""){ 
 nombre = prompt("Dime tu nombre:","") 
document.write("<h1>Hola " + nombre + "</h1>") 
</script> 

Si nos fijamos en la caja prompt veremos que recibe dos parámetros. El segundo era el texto por defecto que sale en la caja como respuesta. Lo hemos dejado como un string vacío para que no salga nada como texto por defecto.



4.6 Objeto document en Javascript

4.6.1 Propiedades del objeto document

alinkColor
Color de los enlaces activos 

Anchor
Un ancla de la página. Se consigue con la etiqueta <A name="nombre_del_ancla">. Se accede por su nombre. 

anchors array
Un array de las anclas del documento. 

Applet
Un applet de la página. Se accede por su nombre. (Javascript 1.1) 

applets array
Un array con todos los applets de la página. (Javascript 1.1) 

Area
Una etiqueta <AREA>, de las que están vinculadas a los mapas de imágenes (Etiqueta ). Se accede por su nombre.(Javascript 1.1) 

bgColor
El color de fondo del documento. 

classes
Las clases definidas en la declaración de estilos CSS. (Javascript 1.2) 

cookie
Una cookie 

domain
Nombre del dominio del servidor de la página. 

Embed
Un elemento de la pagina incrustado con la etiqueta <EMBED>. Se accede por su nombre. (Javascript 1.1) 

embeds array
Todos los elementos de la página incrustados con <EMBED>. (Javascript 1.1) 

fgColor

El color del texto. Para ver los cambios hay que reescribir la página.

From
Un formulario de la página. Se accede por su nombre. 

forms array
Un array con todos los formularios de la página. 

ids
Para acceder a estilos CSS. (Javascript 1.2) 

Image
Una imagen de la página web. Se accede por su nombre. (Javascript 1.1) 

images array
Cada una de las imágenes de la página introducidas en un array. (Javascript 1.1) 

lastModified
La fecha de última modificación del documento. 

linkColor
El color de los enlaces. 

Link
Un enlace de los de la página. Se accede por su nombre. 

links array
Un array con cada uno de los enlaces de la página. 

location
La URL del documento que se está visualizando. Es de solo lectura. 

referrer
La página de la que viene el usuario. 

tags
Estilos definidos a las etiquetas de HTML en la página web. (Javascript 1.2) 

title
El titulo de la página. 

URL
Lo mismo que location, pero es aconsejable utilizar location ya que URL no existe en todos los navegadores. 

vlinkColor

El color de los enlaces visitados.



4.7 Ejemplos de propiedades de document


4.7.1 Ejemplo con la propiedad bgColor

Vamos a utilizar el evento onclick para colocar tres botones en la página que al pulsarlos nos cambie el color del fondo de la página. 

<script> 
function cambiaColor(colorin){
document.bgColor = colorin 
</script> 

<form> 
<input type="Button" value="Rojo" onclick="cambiaColor('ff0000')"> 
<input type="Button" value="Verde" onclick="cambiaColor('00ff00')"> 
<input type="Button" value="Azul" onclick="cambiaColor('0000ff')"> 
</form>



4.7.2 Propiedad title

La propiedad title guarda la cadena que conforma el título de nuestra página web. Vamos a mostrar e título de la página en una caja de alerta.

alert (document.title) 

Ahora vamos a hacer una función que modifica el título de la página , asignándole el texto que le llegue por parámetro. 

function cambiaTitulo(texto){ 
 document.title = texto 

Como en el ejemplo anterior, vamos a crear varios botones que llamen a la función pasándole distintos textos, que se colocarán en el título de la página. 

<form> 
<input type="Button" value="Titulo = Hola a todos" onclick="cambiaTitulo('Hola a todos')"> 
<input type="Button" value="Titulo = Bienvenidos a mi página web" onclick="cambiaTitulo('Bienvenidos a mi página web')"> 
<input type="Button" value="Titulo = Más dias que longanizas" onclick="cambiaTitulo('Más dias que longanizas')"> 
</form>



4.8 Métodos de document

El objeto document tiene una lista de métodos interesantes.

captureEvents()
Para capturar los eventos que ocurran en la página web. Recibe como parámetro el evento que se desea capturar. 

close() 
Cierra el flujo del documento. (Se verá más adelante en este manual un artículo sobre el flujo del documento) 

contextual()
Ofrece una línea de control de los estilos de la página. En el caso que deseemos especificarlos con Javascript.

getSelection()
Devuelve un string que contiene el texto que se ha seleccionado. Sólo funciona en Netscape. 

handleEvent()
Invocas el manejador de eventos del elemento especificado. 

open()
Abre el flujo del documento. 

releaseEvents()
Liberar los eventos capturados del tipo que se especifique, enviándolos a los objetos siguientes en la jerarquía. 

routeEvent()
Pasa un evento capturado a través de la jerarquía de eventos habitual. 

write()
Escribe dentro de la página web. Podemos escribir etiquetas HTML y texto normal. 

writeln()
Escribe igual que el método write(), aunque coloca un salto de línea al final.


Los eventos de document sirven principalmente para controlar dos cosas. Un grupo nos ofrece una serie de funciones para el control de los documentos, como escribir, abrirlos y cerrarlos. El otro grupo ofrece herramientas para el control de los eventos en el documento.



4.9 Flujo de escritura del documento

Cuando el navegador lee una página web la va interpretando y escribiendo en su ventana. El proceso en el que el navegador está escribiendo la página le llamamos flujo de escritura del documento. El flujo comienza cuando se empieza a escribir la página y dura hasta que ésta ha terminado de escribirse. Una vez terminada la escritura de la página el flujo de escritura del documento se cierra automáticamente. Con esto termina la carga de la página. 

Una vez cerrado el flujo no se puede escribir en la página web, ni texto ni imágenes ni otros elementos. En javascript tenemos que respetar el flujo de escritura del documento forzosamente. Es por ello que sólo podemos ejecutar sentencias document.write() (método write() del objeto document) cuando está abierto el flujo de escritura del documento, o lo que es lo mismo, mientras se está cargando la página.

El problema de abrir el flujo de escritura del documento una vez ya está escrita la página es que se borra todo su contenido.

Para que quede claro vamos a hacer un script para escribir en la página una vez ésta ha sido cargada. Simplemente necesitamos un botón y al pulsarlo ejecutar el método write() del objeto document

<form> 
<INPUT type=button value=escribir onclick="window.document.write('hola')"> 
</form> 

Si nos fijamos, en el manejador de eventos onclick hemos colocado la jerarquía de objetos desde el principio, es decir, empezando por el objeto window. Esto es porque hay algunos navegadores que no sobreentienden el objeto window en las sentencias escritas en los manejadores de eventos.



4.9.1 Métodos open() y close() de document

Los métodos open() y close() del objeto document sirven para controlar el flujo del documento desde Javascript. Nos permiten abrir y cerrar el documento explícitamente. 

El ejemplo de escritura en la página anterior se debería haber escrito con su correspondiente apertura y cierre del documento y hubiese quedado algo parecido a esto. 

<script> 
function escribe(){ 
 document.open()
 window.document.write('Hola') 
 document.close() 
}
</script> 
<form>
<INPUT type=button value=escribir onclick="escribe()"> 

</form>

Ahora no escribimos las sentencias dentro del manejador, porque, cuando hay más de una sentencia, queda más claro poner una llamada a una función y en la función colocamos las sentencias que queramos.

Parte 3: Programación orientada a objetos

3.1 Creación de clases en Javascript

Para crear nuestros propios objetos debemos crear una clase (la definición de un objeto con sus propiedades y métodos). Para crear la clase en Javascript debemos escribir una función especial, que se encargará de construir el objeto en memoria e inicializarlo. Esta función se le llama constructor.

function MiClase (valor_inicializacion){ 
 //Inicializo las propiedades y métodos 
 this.miPropiedad = valor_inicializacion 
 this.miMetodo = nombre_de_una_funcion_definida 

Eso era un constructor. Utiliza la palabra this para declarar las propiedades y métodos del objeto que se está construyendo. This hace referencia al objeto que se está construyendo, pues recordemos que a esta función la llamaremos para construir un objeto. A ese objeto que se está construyendo le vamos asignando valores en sus propiedades y también le vamos asignando nombres de funciones definidas para sus métodos. Al construir un objeto técnicamente es lo mismo declarar una propiedad o un método, solo difiere en que a una propiedad le asignamos un valor y a un método le asignamos una función.



3.1.1 La clase AlumnoUniversitario

En este ejemplo vamos a crear un objeto estudiante universitario. Como estudiante tendrá unas características como el nombre, la edad o el número de matrícula. Además podrá tener algún método como por ejemplo matricular al alumno.


3.1.2 Constructor: Colocamos propiedades

Veamos cómo definir el constructor de la clase Alumnouniversitario, pero solamente vamos a colocar por ahora las propiedades de la clase. 

function AlumnoUniversitario(nombre, edad){ 
 this.nombre = nombre 
 this.edad = edad 
 this.numMatricula = null 
}

Los valores de inicialización los recibe el constructor como parámetros, en este caso es sólo el nombre y la edad, porque el número de matrícula no lo recibe un alumno hasta que es matriculado. Es por ello que asignamos a null la propiedad numMatrícula.



3.2.- Creación de clases en Javascript II

Para construir un método debemos crear una función. Una función que se construye con intención de que sea un método para una clase puede utilizar también la variable this, que hace referencia al objeto sobre el que invocamos el método. Pues debemos recordar que para llamar a un método debemos tener un objeto y this hace referencia a ese objeto. 

function matriculate(num_matricula){ 
 this.numMatricula = num_matricula 

La función matricular recibe un número de matrícula por parámetro y lo asigna a la propiedad numMatricula del objeto que recibe este método. Así rellenamos el la propiedad del objeto que nos faltaba. 

Vamos a construir otro método que imprime los datos del alumno. 

function imprimete(){ 
 document.write("Nombre: " + this.nombre) 
 document.write("<br>Edad: " + this.edad) 
 document.write("<br>Número de matrícula: " + this.numMatricula) 

Esta función va imprimiendo todas las propiedades del objeto que recibe el método.



3.2.1 Constructor: Colocamos métodos

Para colocar un método en una clase debemos asignar la función que queremos que sea el método al objeto que se está creando. Veamos cómo quedaría el constructor de la clase AlumnoUniversitario con el método matricular. 

function AlumnoUniversitario(nombre, edad){ 
 this.nombre = nombre 
 this.edad = edad 
 this.numMatricula = null 
 this.matriculate = matriculate 
 this.imprimete = imprimete
}

En las últimas líneas asignamos a los métodos los nombres de las funciones que contienen su código.



3.2.2 Para instanciar un objeto

Para instanciar objetos de la clase AlumnoUniversitario utilizamos la sentencia new:

miAlumno = new AlumnoUniversitario("José Díaz",23)



3.3 Creación de clases en Javascript III

Presentamos el ejemplo completo, en el que creamos una clase, instanciamos objetos y los utilizamos.

//definimos el método matricularte para la clase AlumnoUniversitario 
function matriculate(num_matricula){ 
 this.numMatricula = num_matricula 

//definimos el método imprimete para la clase AlumnoUniversitario 
function imprimete(){ 
 document.write("<br>Nombre: " + this.nombre) 
 document.write("<br>Edad: " + this.edad) 
 document.write("<br>Número de matrícula: " + this.numMatricula) 

//definimos el constructor para la clase 
function AlumnoUniversitario(nombre, edad){ 
 this.nombre = nombre 
 this.edad = edad 
 this.numMatricula = null 
 this.matriculate = matriculate 
 this.imprimete = imprimete 

//creamos un alumno 
miAlumno = new AlumnoUniversitario("José Díaz",23) 

//le pedimos que se imprima 
miAlumno.imprimete() 

//le pedimos que se matricule 
miAlumno.matriculate(305) 

//le pedimos que se imprima de nuevo (con el número de matricula relleno) 
miAlumno.imprimete()

Parte 2: Clases y objetos nativos

2.1 Libreria de funciones Javascript

Javascript pone a nuestra disposición un conjunto de funciones que llamamos funciones nativas de Javascript.

Javascript contiene una buena cantidad de funciones en sus librerías. Como se trata de un lenguaje que trabaja con objetosmuchas de las librerías se implementan a través de objetos. Por ejemplo, las funciones matemáticas o las de manejo de strings se implementan mediante los objetos Math y String. Sin embargo, existen algunas funciones que no están asociadas a ningún objeto y son las que veremos en este capítulo.

Estas son las funciones que Javascript pone a disposición de los programadores.

eval(string) 
Esta función recibe una cadena de caracteres y la ejecuta como si fuera una sentencia de Javascript. 

parseInt(cadena,base)
Recibe una cadena y una base. Devuelve un valor numérico resultante de convertir la cadena en un número en la base indicada. 

parseFloat(cadena) 
Convierte la cadena en un número y lo devuelve. 

escape(carácter) 
Devuelve un el carácter que recibe por parámetro en una codificación ISO Latin 1. 

unescape(carácter) 
Hace exatamente lo opuesto a la función escape. 

isNaN(número)
Devuelve un boleano dependiendo de lo que recibe por parámetro. Si no es un número devuelve un true, si es un numero devuelve false.


2.2 Ejemplos de funciones de la librería Javascript

Varios ejemplos de funciones de la librería: eval(), parseInt(), isNaN().

2.2.1 Función eval

var miTexto = "3 + 5" 
eval("document.write(" + miTexto +")") 

Primero creamos una variable con un texto, en la siguiente línea utilizamos la función eval y como parámetro le pasamos una instrucción javascript para escribir en pantalla. Si concatenamos los strings que hay dentro de los paréntesis de la función eval nos queda esto. 

document.write(3 + 5) 

La función eval ejecuta la instrucción que se le pasa por parámetro, así que ejecutará esta sentencia, lo que dará como resultado que se escriba un 8 en la página web. Primero se resuelve la suma que hay entre paréntesis, con lo que obtenemos el 8 y luego se ejecuta la instrucción de escribir en pantalla.



2.2.2 Función parseInt

Esta función recibe un número escrito como una cadena de caracteres, y un número que indica una base. Se suele utilizar pasándole un string para convertir la variable de texto en un número.

Veamos una serie de llamadas a la función parseInt para ver lo que devuelve y entender un poco más la función. 

document.write (parseInt("34")) 
Devuelve el numero 34 

document.write (parseInt("101011",2)) 
Devuelve el numero 43 

document.write (parseInt("34",8)) 
Devuelve el numero 28 

document.write (parseInt("3F",16)) 
Devuelve el numero 63 

Esta función se utiliza en la práctica para un montón de cosas distintas en el manejo con números, por ejemplo obtener la parte entera de un decimal. 

document.write (parseInt("3.38")) 
Devuelve el numero 3 

También es muy habitual su uso para saber si una variable es numérica, pues si le pasamos un texto a la función que no sea numérico nos devolverá NaN (Not a Number) lo que quiere decir que No es un Número. 

document.write (parseInt("desarrolloweb.com")) 
Devuelve el numero NaN 

Este mismo ejemplo es interesante con una modificación, pues si le pasamos una combinación de letras y números nos dará lo siguiente. 

document.write (parseInt("16XX3U")) 
Devuelve el numero 16 

document.write (parseInt("TG45")) 
Devuelve el numero NaN 

Como se puede ver, la función intenta convertir el string en número y si no puede devuelve NaN.



2.2.3 Función isNaN

Esta función devuelve un boleano. Si recibe un NaN devuelve true y si recibe un número devuelve false.

La función suele trabajar en combinación con la función parseInt o parseFloat, para saber si lo que devuelven estas dos funciones es un número o no. 

miInteger = parseInt("A3.6") 
isNaN(miInteger) 

En la primera línea asignamos a la variable miInteger el resultado de intentar convertir a entero el texto A3.6. Como este texto no se puede convertir a número la función parseInt devuelve NaN. La segunda línea comprueba si la variable anterior es NaN y como si que lo es devuelve un true. 

miFloat = parseFloat("4.7") 
isNaN(miFloat) 

En este ejemplo convertimos un texto a número con decimales. El texto se convierte perfectamente porque corresponde con un número. Al recibir un número la función isNaN devuelve un false.


2.3 Objetos en Javascript

En los ejemplos realizados hasta ahora los hemos utilizado en alguna ocasión, solo vamos a aprender una especie de estructura nueva.

2.3.1 Cómo instanciar objetos

Instanciar un objeto es la acción de crear un ejemplar de una clase para poder trabajar con él luego. Un objeto se crea a partir de una clase y la clase es la definición de las características y funcionalidades de un objeto. Con las clases no se trabaja, estas sólo son definiciones, para trabajar con una clase debemos tener un objeto instanciado de esa clase.

Para crear un objeto a partir de una clase se utiliza la instrucción new:

var miObjeto = new miClase()

En una variable que llamamos miObjeto asigno un nuevo (new) ejemplar de la clase miClase. Los paréntesis se rellenan con los datos que necesite la clase para inicializar el objeto, si no hay que meter ningún parámetro los paréntesis se colocan vacíos.



2.3.2 Cómo acceder a propiedades y métodos de los objetos

Las propiedades se acceden colocando el nombre del objeto seguido de un punto y el nombre de la propiedad que se desea acceder:

miObjeto.miPropiedad


Para llamar a los métodos utilizamos una sintaxis similar pero poniendo al final entre paréntesis los parámetros que pasamos a los métodos: 


miObjeto.miMetodo(parametro1,parametro2)


Si el método no recibe parámetros colocamos los paréntesis también, pero sin nada dentro. 

miObjeto.miMetodo()



2.4 Objetos incorporados en Javascript

Vamos a introducirnos en el manejo de objetos en Javascript y para ello vamos a empezar con el estudio de las clases predefinidas que implementan las librerías para el trabajo con strings, matemáticas, fechas etc.

Las clases que se encuentran disponibles de manera nativa en Javascript,

• String, para el trabajo con cadenas de caracteres.

• Date, para el trabajo con fechas. 

• Math, para realizar funciones matemáticas. 

Number, para realizar algunas cosas con números 

• Boolean, trabajo con boleanos.



Nota: Las clases se escriben con la primera letra en mayúsculas. Las clases son descripciones de la forma y funcionamiento de los objetos.


Hay otros que pertenecen a este mismo conjunto, los enumeramos aquí para que quede constancia de ellos, pero no los vamos a tocar en capítulos siguientes.

Number, que es una clase se escribe con la primera en mayúscula. 

RegExp, que es el nombre de otra clase compuesto por dos palabras, tiene la primera letras de las dos palabras en mayúscula. 

miCadena, que supongamos que es un objeto de la clase String, se escribe con la primera letra en minúscula y la primera letra de la segunda palabra en mayúscula. 

fecha, que supongamos que es un objeto de la clase Date, se escribe en minúsculas por ser un objeto. 

miFunción(), que es una función definida por nosotros, se acostumbra a escribir con minúscula la primera.



2.5 Clase String en Javascript

En javascript las variables de tipo texto son objetos de la clase String. Las propiedades son las características, como por ejemplo longitud en caracteres del string y los métodos son funcionalidades, como pueden ser extraer un substring o poner el texto en mayúsculas.

Para crear un objeto de la clase String lo único que hay que hacer es asignar un texto a una variable. El texto va entre comillas, como ya hemos visto en los capítulos de sintaxis.


2.5.1 Propiedades de String


Length
La clase String sólo tiene una propiedad: length, que guarda el número de caracteres del String.



2.5.2 Métodos de String

Los objetos de la clase String tienen una buena cantidad de métodos:


charAt(indice)
Devuelve el carácter que hay en la posición indicada como índice. Las posiciones de un string empiezan en 0. 

indexOf(carácter,desde)
Devuelve la posición de la primera vez que aparece el carácter indicado por parámetro en un string. Si no encuentra el carácter en el string devuelve -1. El segundo parámetro es opcional y sirve para indicar a partir de que posición se desea que empiece la búsqueda.


lastIndexOf(carácter,desde)
Busca la posición de un carácter exáctamente igual a como lo hace la función indexOf pero desde el final en lugar del principio. El segundo parámetro indica el número de caracteres desde donde se busca, igual que en indexOf. 

replace(substring_a_buscar,nuevoStr)
Implementado en Javascript 1.2, sirve para reemplazar porciones del texto de un string por otro texto, por ejemplo, podríamos uilizarlo para reemplazar todas las apariciones del substring "xxx" por "yyy". El método no reemplaza en el string, sino que devuelve un resultante de hacer ese reemplazo. Acepta expresiones regulares como substring a buscar. 

split(separador)
Este método sólo es compatible con javascript 1.1 en adelante. Sirve para crear un vector a partir de un String en el que cada elemento es la parte del String que está separada por el separador indicado por parámetro. 

substring(inicio,fin)
Devuelve el substring que empieza en el carácter de inicio y termina en el carácter de fin. Si intercambiamos los parámetros de inicio y fin también funciona. Simplemente nos da el substring que hay entre el carácter menor y el mayor. 

toLowerCase()
Pone todas los caracteres de un string en minúsculas. 

toUpperCase()
Pone todas los caracteres de un string en mayúsculas. 

toString()
Este método lo tienen todos los objetos y se usa para convertirlos en cadenas. 

Hasta aquí hemos visto los métodos que nos ayudarán a tratar cadenas. Ahora vamos a ver otros métodos que son menos útiles, pero hay que indicarlos para que quede constancia de ellos. Todos sirven para aplicar estilos a un texto y es como si utilizásemos etiquetas HTML. Veamos cómo. 



anchor(name)
Convierte en un ancla (sitio a donde dirigir un enlace) una cadena de caracteres usando como el atributo name de la etiqueta

<A> lo que recibe por parámetro. 

big()
Aumenta el tamaño de letra del string. Es como si colocásemos en un string al principio la etiqueta <BIG> y al final </BIG>. 

blink()
Para que parpadee el texto del string, es como utilizar la etiqueta <BLINK>. Solo vale para Netscape. 

bold()
Como si utilizásemos la etiqueta <B>. 

fixed()
Para utilizar una fuente monoespaciada, etiqueta <TT>. 

fontColor(color)
Pone la fuente a ese color. Como utilizar la etiqueta <FONT color=el_color_indicado>. 

fontSize(tamaño) 
Pone la fuente al tamaño indicado. Como si utilizásemos la etiqueta <FONT> con el atributo size. 

italics()
Pone la fuente en cursiva. Etiqueta <I>. 

link(url)
Pone el texto como un enlace a la URL indicada. Es como si utilizásemos la etiqueta <A> con el atributo href indicado como parámetro. 

small()
Es como utilizar la etiqueta <SMALL> 

strike()
Como utilizar la etiqueta <STRIKE>, que sirve para que el texto aparezca tachado.

sub()
Actualiza el texto como si se estuviera utilizando la etiqueta <SUB>, de subíndice. 

sup()

Como si utilizásemos la etiqueta <SUP>, de superíndice.



2.6 Ejemplos de funcionamiento de la clase String


2.6.1 Ejemplo de strings 1

Vamos a escribir el contenido de un string con un carácter separador ("-") entre cada uno de los caracteres del string. 

var miString = "Hola Amigos" 
var result = "" 

for (i=0;i<miString.length-1;i++) { 
 result += miString.charAt(i) 
 result += "-" 


result += miString.charAt(miString.length - 1) 
document.write(result) 


  • Primero creamos dos variables, una con el string a recorrer y otra con un string vacío, donde guardaremos el resultado.
  • Luego hacemos un bucle que recorre desde el primer hasta el penúltimo carácter del string -utilzamos la propiedad length para conocer el número de caracteres del string- y en cada iteración colocamos un carácter del string seguido de un carácter separador "-". 
  • Como aun nos queda el último carácter por colocar lo ponemos en la siguiente línea después del bucle.
  • Utilizamos la función charAt para acceder a las posiciones del string. 
  • Finalmente imprimimos en la página el resultado.




2.6.2 Ejemplo de strings 2

Vamos a hacer un script que rompa un string en dos mitades y las imprima por pantalla. Las mitades serán iguales, siempre que el string tenga un número de caracteres par. En caso de que el número de caracteres sea impar no se podrá hacer la mitad exacta, pero partiremos el string lo más aproximado a la mitad. 

var miString = "0123456789" 
var mitad1,mitad2 

posicion_mitad = miString.length / 2 

mitad1 = miString.substring(0,posicion_mitad) 
mitad2 = miString.substring(posicion_mitad,miString.length) 

document.write(mitad1 + "<br>" + mitad2) 


  • Las dos primeras líneas sirven para declarar las variables que vamos a utilizar e inicializar el string a partir. 
  • En la siguiente línea hallamos la posición de la mitad del string. 
  • En las dos siguientes líneas es donde realizamos el trabajo de poner en una variable la primera mitad del string y en la otra la segunda. Para ello utilizamos el método substring pasándole como inicio y fin en el primer caso desde 0 hasta la mitad y en el segundo desde la mitad hasta el final. 
  • Para finalizar imprimimos las dos mitades con un salto de línea entre ellas.




2.7 Clase Date en Javascript

Para crear un objeto fecha con el día y hora actuales colocamos los paréntesis vacíos al llamar al constructor de la clase Date.

miFecha = new Date() 

Para crear un objeto fecha con un día y hora distintos de los actuales tenemos que indicar entre paréntesis el momento con que inicializar el objeto.

miFecha = new Date(año,mes,dia,hora,minutos,segundos)

miFecha = new Date(año,mes,dia)

*enero es el mes 0.

Los objetos de la clase Date no tienen propiedades pero si un montón de métodos:

getDate()
Devuelve el día del mes. 

getDay()
Devuelve el día de la semana. 

getHours()
Retorna la hora. 

getMinutes()
Devuelve los minutos. 

getMonth()
Devuelve el mes (atención al mes que empieza por 0). 

getSeconds()
Devuelve los segundos. 

getTime()
Devuelve los milisegundos transcurridos entre el día 1 de enero de 1970 y la fecha correspondiente al objeto al que se le pasa el mensaje.

getYear()
Retorna el año, al que se le ha restado 1900. Por ejemplo, para el 1995 retorna 95, para el 2005 retorna 105. Este método está obsoleto en Netscape a partir de la versión 1.3 de Javascript y ahora se utiliza getFullYear(). 

getFullYear()
Retorna el año con todos los dígitos. Usar este método para estar seguros de que funcionará todo bien en fechas posteriores al año 2000. 

setDate()
Actualiza el día del mes. 

setHours()
Actualiza la hora. 

setMinutes()
Cambia los minutos. 

setMonth()
Cambia el mes (atención al mes que empieza por 0). 

setSeconds()
Cambia los segundos. 

setTime()
Actualiza la fecha completa. Recibe un número de milisegundos desde el 1 de enero de 1970. 

setYear()
Cambia el año recibe un número, al que le suma 1900 antes de colocarlo como año de la fecha. Por ejemplo, si recibe 95 colocará el año 1995. Este método está obsoleto a partir de Javascript 1.3 en Netscape. Ahora se utiliza setFullYear(), indicando el año con todos los dígitos. 

setFullYear()
Cambia el año de la fecha al número que recibe por parámetro. El número se indica completo ej: 2005 o 1995. Utilizar este método para estar seguros que todo funciona para fechas posteriores a 2000.



2.8 Ejemplo de funcionamiento de Date

En este ejemplo vamos a crear dos fechas, una con el instante actual y otra con fecha del pasado. Luego las imprimiremos las dos y extraeremos su año para imprimirlo también. Luego actualizaremos el año de una de las fechas y la volveremos a escribir con un formato más legible.

//en estas líneas creamos las fechas 
miFechaActual = new Date() 
miFechaPasada = new Date(1998,4,23) 

//en estas líneas imprimimos las fechas. 
document.write (miFechaActual) 
document.write ("<br>") 
document.write (miFechaPasada) 

//extraemos el año de las dos fechas 
anoActual = miFechaActual.getFullYear() 
anoPasado = miFechaPasada.getFullYear() 

//Escribimos en año en la página 
document.write("<br>El año actual es: " + anoActual) 
document.write("<br>El año pasado es: " + anoPasado) 

//cambiamos el año en la fecha actual 
miFechaActual.setFullYear(2005) 

//extraemos el día mes y año 
dia = miFechaActual.getDate() 
mes = parseInt(miFechaActual.getMonth()) + 1 
ano = miFechaActual.getFullYear() 

//escribimos la fecha en un formato legible 
document.write ("<br>") 
document.write (dia + "/" + mes + "/" + ano)



2.9 Clase Math en Javascript

La clase Math proporciona los mecanismos para realizar operaciones matemáticas. Para trabajar con la clase Math no deberemos utilizar la instrucción newutilizaremos el nombre de la clase para acceder a sus propiedades y métodos.


2.9.1 Propiedades de Math

E
Número E o constante de Euler, la base de los logaritmos neperianos. 

LN2
Logaritmo neperiano de 2. 

LN10
Logaritmo neperiano de 10. 

LOG2E
Logaritmo en base 2 de E. 

LOG10E
Logaritmo en base 10 de E. 

PI
Conocido número para cálculo con círculos. 

SQRT1_2
Raiz cuadrada de un medio. 

SQRT2
Raiz cuadrada de 2. 



2.9.2 Métodos de Math

Así mismo, tenemos una serie de métodos para realizar operaciones mateméticas típicas, aunque un poco complejas. Todos los que conozcan las matemáticas a un buen nivel conocerán el significado de estas operaciones. 

abs()
Devuelve el valor absoluto de un número. El valor después de quitarle el signo. 

acos()
Devuelve el arcocoseno de un número en radianes. 

asin()
Devuelve el arcoseno de un numero en radianes. 

atan()
Devuelve un arcotangente de un numero. 

ceil()
Devuelve el entero igual o inmediatamente siguiente de un número. Por ejemplo, ceil(3) vale 3, ceil(3.4) es 4. 

cos()
Retorna el coseno de un número. 

exp()
Retorna el resultado de elevar el número E por un número. 

floor()
Lo contrario de ceil(), pues devuelve un número igual o inmediatamente inferior. 

log()

Devuelve el logaritmo neperiano de un número.

max()
Retorna el mayor de 2 números. 

min()
Retorna el menor de 2 números. 

pow()
Recibe dos números como parámetros y devuelve el primer número elevado al segundo número. 

random()
Devuelve un número aleatorio entre 0 y 1. Método creado a partir de Javascript 1.1. 

round()
Redondea al entero más próximo. 

sin()
Devuelve el seno de un número con un ángulo en radianes. 

sqrt()
Retorna la raiz cuadrada de un número. 

tan()

Calcula y devuelve la tangente de un número en radianes.


Vamos a ver un sencillo ejemplo sobre cómo utilizar métodos y propiedaes de la clase Math

document.write (Math.cos(2 * Math.PI))

document.write ("<br>") 


document.write (Math.sin(2 * Math.PI))



2.10 Clase Number en Javascript

La clase Number nos sirve para crear objetos que tienen datos numéricos como valor.


El valor del objeto Number que se crea depende de lo que reciba el constructor de la clase Number. Con estas reglas: 

- Si el constructor recibe un número, entonces inicializa el objeto con el número que recibe. Si recibe un número

entrecomillado lo convierte a valor numérico, devolviendo también dicho número. 

- Devuelve 0 en caso de que no reciba nada. 

- En caso de que reciba un valor no numérico devuelve NaN, que significa "Not a Number" (No es un número) 

- Si recibe false se inicializa a 0 y si recibe true se inicializa a 1. 

Su funcionamiento se puede resumir en estos ejemplos. 

var n1 = new Number() 
document.write(n1 + "<br>") 
//muestra un 0 

var n2 = new Number("hola") 
document.write(n2 + "<br>") 
//muestra NaN 

var n3 = new Number("123") 
document.write(n3 + "<br>") 
//muestra 123 

var n4 = new Number("123asdfQWERTY") 
document.write(n4 + "<br>") 
//muestra NaN 

var n5 = new Number(123456) 
document.write(n5 + "<br>") 
//muestra 123456 

var n6 = new Number(false) 
document.write(n6 + "<br>") 
//muestra 0 

var n7 = new Number(true) 
document.write(n7 + "<br>") 

//muestra 1



2.10.1 Propiedades de la clase Number

NaN

Como hemos visto, significa Not a Number, o en español, no es un número. 

MAX_VALUE y MIN_VALUE

Guardan el valor del máximo y el mínimo valor que se puede representar en Javascript 

NEGATIVE_INFINITY y POSITIVE_INFINITY

Representan los valores, negativos y positivos respectivamente, a partir de los cuales hay desbordamiento. 

Estas propiedades son de clase, así que accederemos a ellas a partir del nombre de la clase, tal como podemos ver en este ejemplo en el que se muestra cada uno de sus valores. 

document.write("Propiedad NaN: " + Number.NaN) 
document.write("<br>") 
document.write("Propiedad MAX_VALUE: " + Number.MAX_VALUE) 
document.write("<br>") 
document.write("Propiedad MIN_VALUE: " + Number.MIN_VALUE) 
document.write("<br>") 
document.write("Propiedad NEGATIVE_INFINITY: " + Number.NEGATIVE_INFINITY) 
document.write("<br>") 

document.write("Propiedad POSITIVE_INFINITY: " + Number.POSITIVE_INFINITY)



2.11 Clase Boolean en Javascript

- Se inicializa a false cuando no pasas ningún valor al constructor, o si pasas una cadena vacía, el número 0 o la palabra

false sin comillas. 

- Se inicializa a true cuando recibe cualquier valor entrecomillado o cualquier número distinto de 0. 

Se puede comprender el funcionamiento de este objeto fácilmente si examinamos unos ejemplos. 

var b1 = new Boolean() 
document.write(b1 + "<br>") 
//muestra false 

var b2 = new Boolean("") 
document.write(b2 + "<br>") 
//muestra false 

var b25 = new Boolean(false) 
document.write(b25 + "<br>") 
//muestra false 

var b3 = new Boolean(0) 
document.write(b3 + "<br>") 
//muestra false 

var b35 = new Boolean("0") 
document.write(b35 + "<br>") 
//muestra true 

var b4 = new Boolean(3) 
document.write(b4 + "<br>") 
//muestra true 

var b5 = new Boolean("Hola") 
document.write(b5 + "<br>") 
//muestra true