Objetos

En javascript un Objeto es un conjunto {...} de elementos nombre: valor (el equivalente en Java, con respecto a la estructura de datos, sería un hash map. Decimos que el nombre es una propiedad del objeto y valor es el valor de la propiedad que puede ser un valor simple, otro objeto o una función. Por ejemplo, en el siguiente código estamos definiendo una variable llamada person cuyo valor consiste de cuatro propiedades:

var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};

Es equivalente:

var person = { firstName:"John", lastName:"Doe", age:50, eyeColor:"blue" }; //Note que antes del corchete } no va coma ,

En el siguiente ejemplo tenemos una variable llamada user cuyo valor es un objeto que tiene dentro de sus propiedades, otro objeto llamado size. Para acceder a las propiedades del objeto utilizamos la notación "." como en user.name o user.size.top:

var user = { name: "Rose", age: 25, size: { top: 90, middle: 60, bottom: 90 } } console.log( user.name ) // "Rose" console.log( user.size.top ) // 90

Se pueden crear arreglos de objetos, como en el siguiente ejemplo:

var personas = [ { nombre: "Jaime", email: "[email protected]" }, { nombre: "Jose", email: "[email protected]" }, { nombre: "Juan", email: "[email protected]" } ];

Acceso a los valores de los objetos

También se puede acceder a las propiedades de un objeto de las siguientes formas:

  • nombredelobjeto[nombrepropiedad] Por ejemplo user[name]
  • nombredelobjeto[expresion] En este caso expresion debe tener como valor el nombre de una propiedad. Por ejemplo: x = "name" ; user[x]

Las propiedades de un objeto se pueden recorrer con un ciclo for/in como en el siguiente ejemplo:

var person = var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"}; var text = ""; var x; for (x in person) { text += person[x]; }

El resultado de la ejecución:

Creación de objetos

En Javascript un objeto no es una instancia de una clase en el sentido de un lenguaje como java. Podemos crear objetos como en los ejemplos anteriores al asignarles como valor un arreglo asociativo o podemos crearlos de las siguientes formas:

Objeto con valor vacío

var estudiante = {}

y luego crearle propiedades:

estudiante.nombre = "Juan"

Utilizando la palabra reservada new

En el siguiente ejemplo se crea un objeto vacío con new Object() y luego se le adiciona las propiedades.

var person = new Object(); person.firstName = "John"; person.lastName = "Doe"; person.age = 50; person.eyeColor = "blue";

Utilizando una función como el constructor del objeto

La manera más común de definir un constructor de objetos es utilizando una función. En el siguiente ejemplo definimos la función Persona. Esto es similar al método constructor de una clase java donde se reciben los valores de los atributos del objeto que se quiere crear:

function Persona(nombre, apellido, edad, cedula) { this.nombre = nombre; this.apellido = apellido; this.edad = edad; this.cedula = cedula; }

La forma de utilizar la función para que se convierta en "constructora de objetos" es:

var persona1 = new Persona("Juan", "Torres", 50, "809872"); var persona2 = new Persona("Sonia", "Ramirez", 48, "54378");

Cuál es la diferencia si cambiamos el código de la función asi:

function Persona(nombre, apellido, edad, cedula) { var _nombre = nombre; var _apellido = apellido; var _edad = edad; var _cedula = cedula; } var persona1 = new Persona("Juan", "Torres", 50, "809872");

Métodos de los objetos

Cuando el valor de una propiedad en un objeto es la definición de una función, decimos que esta propiedad es un método del objeto. En el siguiente ejemplo estamos definiendo un objeto llamado juan. Este tiene tres propiedades: nombre, apellido y nombreCompleto. La propiedad nombreCompleto tiene por valor la definición de una función (anonima). En este caso decimos que nombreCompleto es un método del objeto juan.

var juan = { nombre : "Juan", apellido : "Perez", nombreCompleto : function() { return this.apellido + " " + this.nombre; } }; //invocamos el método console.log(juan.nombreCompleto());

Note el uso de la palabra clave this en la línea 5. Cuando se invoque el método juan.nombreCompleto(), el contexto de ejecución es juan y this hace referencia a ese contexto.

Qué sucede si quitamos la palabra this del código anterior:




Cuando usamos una función como constructor de objetos podemos definir dentro de la función otras funciones que corresponderán a los métodos de los objetos:

function Persona(nombre, apellido, edad, cedula) { var _nombre = nombre; var _apellido = apellido; var _edad = edad; var _cedula = cedula; this.nombreCompleto = function () { return apellido + " " + nombre; } }

Como en el ejemplo anterior, podemos utilizar la función como constructora de objetos, y podemos utilizar la notación . para invocar la función.

var persona1 = new Persona("Juan", "Torres", 50, "809872"); var persona2 = new Persona("Sonia", "ramirez", 48, "54378"); console.log(persona1.nombreCompleto()); console.log(persona2.nombreCompleto());

Si ejecutamos el ejemplo anterior en una consola de javascript (jsconsole o chrome) podemos ver el contenido de cada uno de los objetos. Como se puede ver en la figura, cada objeto tiene el código de la función nombreCompleto. Este código es el valor de la propiedad nombreCompleto.

Ejercicios

Ejercicio 1

El llamado a console.log(persona1.nombreCompleto); retorna:





Ejercicio 2

Defina una función constructor de objetos Estudiante que tenga como propiedades, nombre, apellido, nombre completo (concatenando nombre y apellido) y notas (todas las notas del estudiante). La función debe tener un método que calcule el promedio del estudiante.

Ver Solución

Ejercicio 3

Modifique el ejercicio anterior para calcular el promedio ponderado del estudiante. Suponga que cada nota tiene el nombre del curso, el número de créditos y el valor obtenido por el estudiante.

Ver Solución

Ejercicio 4

Explique el siguiente código:

var app = new Object(); app.logger = function(valor ) { console.log(valor); } ; app.logger("Hola");

El valor de la propiedad logger del objeto app es la definición de una función que muestra en la consola el valor que recibió como argumento. En la línea 7 se invoca la función contenida en logger.

Ejercicio 5

Explique el siguiente código:

var app = new Object(); function imprimirConsola(texto) { console.log(texto); }; app.logger = function( valor, imprimir) { imprimir(valor); } ; app.logger("Hola", imprimirConsola);
Ejercicio 6

Explique el siguiente código:

var app = new Object(); app.logger = function(valor, imprimir) { imprimir(valor); }; app.logger("Hola", function(texto) { console.log(texto); });
Ejercicio 7

Explique el siguiente código:

var myAppModule = angular.module('myApp', []);
Ejercicio 8
Explique el siguiente código:
var app = new Object(); app.saludo = function() { return function(name) { return 'Hello, ' + name + '!'; }; }
Ejercicio 9

Explique el siguiente código:

(function() { return function(name) { return 'Hello, ' + name + '!'; }; } )()("Jaime");

Atributos y métodos privados y públicos

Para que una variable sea local a la función que la define, esta debe estar precedida de la palabra var. Cuando la función juega el rol de función constructora de objetos, estas variables locales son equivalentes a los atributos privados en java. De lo contrario, sino está la palabra var, estas variables son públicas y pueden ser accedidas directamente desde fuera del objeto violando el principio de encapsulamiento.

Lo mismo sucede con los métodos. La función que define un método, por ejemplo, la función_suma en la línea 6 del listado siguiente, es una función privada o método privado que no puede se utilizado desde fuera de la función constructora. Los métodos que se asignan a variables públicas son métodos públicos como en las líneas 11, 15 y 17 (setNombre, getNombre y sumar)

function Ejemplo() { // atributo privado var _nombre; // método privado function _suma(a, b) { return a + b; } // métodos públicos this.setNombre = function(nombre) { _nombre = nombre; } this.getNombre = function() { return _nombre; } this.sumar = function(x, y) { return _suma(x, y); } } var ej = new Ejemplo(); ej.setNombre('ejemplo'); ej.getNombre(); // ejemplo ej._nombre; // undefined ej.sumar(10, 12); // 22 ej._suma(10, 12); // error

results matching ""

    No results matching ""