Herramientas para desarrolladores : Cursos, manuales y guías de referencia : Cursos : Curso de JavaScript :

Capítulo 4: Funciones y objetos

  1. Definición de una función
  2. Funciones recursivas
  3. Creación de objetos
  4. Arrays asociativos

1. Definición de una función

function nombre_funcion(argumentos) {
    bloque de comandos
}

El nombre de la función es sensible a mayúsculas y minúsculas. Puede incluir el caracter "_" y empezar con una letra.

Ejemplo:

function ImprimeNombre(nombre) {
    document.write("<HR>Tu nombre es <B><I>")
    document.write(nombre)
    document.write("</B></I><HR>")
}

La variable nombre sólo existe dentro de la función y lo mismo pasa para cualquier variable declarada dentro de la función.

Las funciones pueden devolver un valor. Para ello:

function cubo(numero) {
    var cubo = numero * numero * numero
    return cubo
}

También podría haber sido

return numero * numero * numero

La función eval() evalúa un string devolviendo un valor numérico. Por ejemplo, eval("10*10") devolverá el valor 100.

Ejemplo:

<HTML>
<HEAD><TITLE>Preguntador</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
//DEFINICION DE LA FUNCION HazPregunta()
function HazPregunta(pregunta) {
    //VARIABLES LOCALES
    var solucion = eval(pregunta)
    var salida = "Que da " + pregunta + "?"
    var correcto='<IMG SRC="correcto.gif">'
    var incorrecto='<IMG SRC="incorrecto.gif">'
    //REALIZA LA PREGUNTA
    var respuesta = prompt(salida,"0")
    //COMPRUEBA EL RESULTADO
    return (respuesta == solucion) ? correcto : incorrecto
}
//-->
</SCRIPT></HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
//EJECTUA LA FUNCION HazPregunta
var resultado = HazPregunta("10 + 10")
document.write(resultado)
//-->
</SCRIPT>
</BODY></HTML>

2. Funciones recursivas

Son las que se llaman a sí mismas. Un ejemplo típico es el de la función que calcula el factorial de un número:

function factorial(numero) {
    if (numero > 1) {
        return numero * factorial(numero - 1)
    } else {
        return numero
    }
}

Esta función se basa en que el factorial de un número x es igual x multiplicado por el factorial de x - 1:

x! = x * (x - 1)!

Veamos una modificación del ejemplo anterior en la que la función HazPregunta es recursiva:

<HTML>
<HEAD><TITLE>Preguntador</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
//DEFINICION DE LA FUNCION HazPregunta()
function HazPregunta(pregunta) {
    //VARIABLES LOCALES
    var solucion = eval(pregunta)
    var salida = "Que da " + pregunta + "?"
    var correcto='<IMG SRC="correcto.gif">'
    var incorrecto='<IMG SRC="incorrecto.gif">'
    //REALIZA LA PREGUNTA
    var respuesta = prompt(salida,"0")
    //COMPRUEBA EL RESULTADO
    return (respuesta == solucion) ? correcto : HazPregunta(pregunta)
}
//-->
</SCRIPT></HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
<!--
//EJECTUA LA FUNCION HazPregunta
var resultado = HazPregunta("10 + 10")
document.write(resultado)
//-->
</SCRIPT>
</BODY></HTML>

Esta función puede crear problemas de memoria si el usuario nunca da la respuesta correcta. Una posible forma de evitar esto consiste en introducir un contador del número respuestas dadas por el usuario y compararlo con el número de oportunidades que tiene para responder a la pregunta.

Para más información sobre las funciones recursivas y sus ventajas e inconvenientes, véase nuestro capítulo de Funciones recursivas, en la sección de JavaScript avanzado.

3. Creación de objetos

Para crear objetos, primero es necesario definir su tipo (o clase):

function empleado(nombre, edad, puesto) {
    this.nombre = nombre
    this.edad = edad
    this.puesto = puesto
}

En JavaScript, la partícula this se refiere al objeto en el que se utiliza. Una vez definida la clase, podemos crear variables (instanciar objetos) de esa clase de la siguiente manera:

empleado_1 = new empleado("Pedro", 26, "Programador")

Pueden añadirse propiedades a los objetos aunque estas no haya sido declaradas en la definición de la clase. Por ejemplo:

empleado_1.jefe = "Luis"

Estas propiedades nuevas sólo afectaran a ese objeto y no al resto.

Los objetos pueden anidarse de forma que un objeto sea un a propiedad de otro objeto. Por ejemplo:

function oficina(ciudad, pais) {
    this.ciudad = ciudad
    this.pais = pais
}
oficinaPedro = new oficina("Madrid","España")
empleado_1 = new empleado("Pedro", 26, "Programador", oficinaPedro)

En el ejemplo anterior, hay que definir la clase empleado de esta forma:

function empleado(nombre, edad, puesto, oficina)
    this.nombre = nombre
    this.edad = edad
    this.puesto = puesto
    this.oficina = oficina
}

Dentro de la definición de la clase o tipo del objeto, pueden incluirse funciones que accedan a sus propiedades. Estas funciones reciben el nombre de métodos. Un método se define de la siguiente manera:

function mostrarPerfil() {
    document.write("Nombre: " + this.nombre + "<BR>")
    document.write("Edad: " + this.edad + "<BR>")
    document.write("Puesto: " + this.puesto + "<BR>")
}

function empleado(nombre, edad, puesto) {
this.nombre = nombre
this.edad = edad
this.puesto = puesto
this.mostrarPerfil = mostrarPerfil
}

Así pueden mostrarse las propiedades del objeto empleado invocando el método asociado:

empleado_1.mostrarPerfil

Ejemplo final:

<HTML><HEAD><TITLE>Empleados</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
//DEFINE EL METODO muostrarPerfil
function mostrarPerfil() {
    document.write("<H1>Perfil del empleado " + this.nombre + "</H1><HR><PRE>")
    document.writeln("Edad: " + this.edad)
    document.writeln("Puesto: " + this.puesto)
    document.write("</PRE>")
}
//DEFINE EL OBJECTO EMPLEADO
function empleado() {
    this.nonmbre = prompt("Introduzca el nombre del empleado: ", "Nombre")
    this.edad = prompt("Introduzca la edad de " + this.nombre, "00")
    this.mostrarPerfil = mostrarPerfil
}
nuevoEmpleado = new empleado()
//-->
</SCRIPT>
</HEAD><BODY><SCRIPT LANGUAGE="JavaScript">
<!--
nuevoEmpleado.mostrarPerfil()
//-->
</SCRIPT>
</BODY></HTML>

4. Arrays asociativos

En JavaScript las propiedades de un objeto y los arrays están relacionados de la siguiente manera:

empleado_1[0] = "Pedro"
empleado_1[1] = 26
empleado_1[2] = "Programador"

Y también se produce la siguiente equivalencia:

empleado_2["nombre"] equivale a empleado_2[0] empleado_2["edad"] equivale a empleado_2[1]

Vamos a ver un ejemplo para la creación de un menú de usuario:

<HTML><HEAD><TITLE>Menu de usuario</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
//DEFINE METODO PARA VER LA INFORMACION
function verInfo() {
    document.write("<H1>Perfil del empleado: " + this.nombre + "</H1><HR><PRE>")
    document.writeln("Numero de empleado: " + this.numero)
    document.writeln("Edad: " + this.edad)
    document.writeln("Puesto: " + this.puesto)
    document.write("</PRE>")
}
//DEFINE METODO PARA OBTENER LA INFORMACION
function obtenerInfo() {
    var menu = "1. Salir/n2. Nombre/n3. Edad/n4. Puesto"
    var eleccion = prompt(menu, "0")
if (eleccion != null) {
    if ((eleccion < 0) || (eleccion > 4)) {
        alert ("Eleccion incorrecta.")
        this.obtenerInfo()
    } else {
        if (eleccion != "0") {
            this[eleccion - 1] = prompt("Introduzca informacion","")
            this.obtenerInfo()
        }
    }
}
//DEFINE OBJETO
function empleado() {
    this.nombre = ""
    this.edad = 0
    this.puesto = 0
    this.verInfo = verInfo
    this.obtenerInfo = obtenerInfo
}
empleadoNuevo = new empleado()
//-->
</SCRIPT></HEAD>
<BODY><SCRIPT LANGUAGE="JavaScript">
<!--
empleadoNuevo.obtenerInfo()
empleadoNuevo.verInfo()
//-->
</SCRIPT>
</BODY></HTML>

 

Tutorial de JavaScript