POO Javascript
POO Javascript
Hay más tipos de programación orientada a objetos, y es usada por lenguajes muy
conocidos. Es el caso de la programación basada en prototipos, y su lenguaje más
conocido es JavaScript.
</script >
MOZILLA
FIREFOX
5. Tipos de objetos en Javascript (Notación basada en el
constructor y notación literal)
var numero=21;
var numero_obj= new Number(21);
console.log(numero);
console.log(numero);
var logico=true;
var logico_obj=new Boolean(true);
console.log(logico);
console.log(logico_obj);
//Objetos compuestos
var lista=[1,2,3,4];
var lista_obj=new Array(1,2,3,4);
console.log(lista);
console.log(lista_obj);
var objeto_literal={'nombre':'Robert',edad:33};
var objeto_constructor=new Object();
objeto_constructor.nombre='Robert';
objeto_constructor.edad=33;
console.log(objeto_literal);
console.log(objeto_constructor);
//Métodos
console.log('Año: '+ahora.getFullYear());
Las clases estáticas como Math están definidas
//Clases estáticas para no instanciarse, se usan sus métodos
var valorPi=Math.PI; directamente como en este caso: Math.floor y
var valor=30.89; Math.pi
var parteEntera=Math.floor(valor);
console.log("La parte entera de "+valor+" es "+ parteEntera);
</script>
</body>
</html>
8. EJEMPLO: Objetos literales en Javascript para implementación
de la POO
index.html
<!DOCTYPE html>
<html> Temas relacionados:
<head> - Tema 5: Tipos de objetos
<meta charset="UTF-8">
<title>Uso de objetos literales</title>
<link rel="stylesheet" href="
http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,4
00,600" type="text/css">
</head> Aunque este bloque de código es
<body> funcional , no representa en forma
<script> estricta las características de la
var objetoGenerico={ POO, debido a:
nombre:'Robert', - No hay instanciación de
edad:33, objetoGenerico.
objeto
saludar: function(nombrePila){ - No existen especificadores
console.log("Que hubo amigo "+nombrePila) acceso (public, private, protected)
de
} para los campos nombre, edad,
} saludar.
console.log(objetoGenerico); - Acceso y muestra de la
objetoGenerico.saludar("Cachete"); nombrePila que no esta definida
variable
</script> en
o instancia,
ninguna como
parte una se de
variable
</body> clase
normalmente
definiría en otros lenguajes de
</html> programación basados en POO.
9. Añadir métodos o propiedades a la instancia y no al
prototipo
<script>
function Persona(nom,ape,anio)
{ this.nombre=nom;
this.apellido=ape;
this.anionacimiento=anio;
this.nombreCompleto = function(){
return this.nombre+"
"+this.apellido;
}
}
var profesorx=new Persona("Charles","Xavier",1963); Se esta añadiendo propiedad a un
profesorx.poder="telepatía"; objeto no a un prototipo, así el
var marvelgirl=new Persona("Jean","Grey",1963); profesorx tiene poder asignado, pero
console.log(profesorx.poder); no marvelgirl.
console.log(marvelgirl.poder);
Se esta añadiendo método a un
marvelgirl.nacimiento=function(){ objeto no a un prototipo, así el
return "Año de nacimiento: "+this.anionacimiento; marvelgirl tiene método para mostrar
} su año de nacimiento, pero no
profesorx.
console.log(marvelgirl.nacimiento()); La salida mostrada en pantalla mediante
console.log(profesorx.nacimiento()); el
</script>
inspector de consola de navegador es:
10. Añadir métodos o propiedades al prototipo y no a la
instancia
<script>
function Persona(nom,ape,anio){ Un prototipo es un objeto del cual
this.nombre=nom; otros objetos heredan propiedades
this.apellido=ape;
this.anionacimiento=anio;
this.nombreCompleto = function(){
return this.nombre+" "+this.apellido; FORMA 1. Añadiendo métodos o
} propiedades en el prototipo de la
} función (el constructor)
Persona.prototype.estado="vivo";
Persona.prototype.modoAndar=function(medio){
return "Depende, si es el profesorX anda en silla de
ruedas...";
} FORMA 2. Añadir usando la
var profesorx=new Persona("Charles","Xavier",1963); palabra reservada prototype en el
var marvelgirl=new Persona("Jean","Grey",1963); formato:
<nombreprototipo>.prototype.propiedad_o_m
console.log("El modo de andar del personaje es: étodo …
"+profesorx.modoAndar());
</script> Al añadir la función a prototype se optimiza el
uso de memoria por cada instancia que se
cree, ya que todas compartirán a la misma
función.
11. Propiedades estáticas en JavaScript
Al agregar un método público es correcto hacerlo así
también:
this.calculoArea=function(){
<script> return radio*Esfera.pi*Esfera.pi;
function Esfera(radio){ }
this.radio=radio;
La forma anterior se denomina “Creación de función Fuera de la
Esfera.prototype.calculoArea=function(){ definición del prototipo”, es correcta pero no eficiente pues se
crea un copia de la función en cada instancia que se cree de
return radio*Esfera.pi*Esfera.pi;
Esfera. En contraparte, lo marcado en rojo hace que cada
} instancia comparta la misma función.
}
Esfera.forma="Redonda";
FORM D
Esfera.pi=3.1416;
A E
PROPIED
CREAR UN
circulo1=new Esfera(4);
ESTÁTIC
AD A
console.log(circulo1.calculoArea());
A.
console.log(Esfera.forma);
</script> Para acceder a un método o
propiedad estático se usa el nombre
del prototipo, en este caso Esfera.
12. Propiedades públicas en JavaScript (PARTE 1 DE 2)
<script>
function persona(){
}
var yo=new Persona();
</script>
1. new Persona() Esta creando un objeto genérico de la clase object, esto se puede
demostrar
ejecutando ifel(explosivo4
siguiente código.
instanceof Object)
alert ('ok');
En JavaScript todas las instancias no dejan de ser objetos del mismo tipo, pero lo que cambian
es el prototipo de cada una.
2.Esta asignando el prototipo de ese objeto creado la clase Persona (Persona.prototype). El
prototipo es algo que comparten todas las instancias de la misma clase.
Esa vinculación del prototipo de un objeto a la función constructora es la que va a permitir que
la instancia tenga que acceso a las propiedades y métodos de clase.
3. Se esta ejecutando la función constructora de la clase Persona.
4. Devuelve el objeto creado que de tipo object pero cuyo prototipo es de la clase constructora:
function persona(){
}
De manera que en la instancia ‘yo’, ya existe una referencia a ese nuevo
objeto.
12. Propiedades públicas en JavaScript (PARTE 2 DE 2)
<script>
function Explosivo(parametros){ Propiedades y métodos públicos se añaden
this.nombre=parametros.nombre; a través de la palabra reservada this.
this.componente=parametros.componente;
} Añadir métodos públicos con this no tiene
sentido para la eficiencia, pues lo que da
var explosivo1=new caracterización a cada instancia es
Explosivo({nombre:'dinamita',componente:'nitroglicerina'}); sus propiedades, en tanto que los métodos
var explosivo2=new deben ser compartidos. La definición
Explosivo({nombre:'geles',componente:'nitrocelulosa'}); correcta es algo como:
explosivo2['nombre']="Otro"; Explosivo.prototype.detonar=function(){
explosivo1.nombre="Quien sabe"; return “Boom";
}
console.log(explosivo1);
console.log(explosivo2); Un objeto también puede ser tratado
</script> como un array asociativo:
nombreObjeto['nombrePropiedad']
13. Propiedades privadas en JavaScript (parte 1 de
2)
La traducción realizada por lenguajes de Microsoft como TypeScript acepta
la escritura de métodos privados, aunque como se ve en el ejemplo a la hora
de traducirlo a javascript lo transforma en público a través de this.
Código retornado en
Código ingresado en
JavaScript en el sitio
TypeScript
class Persona{ typescriptlang.org
private edad:number=0; var Persona = (function () {
function Persona(dni, nombre) {
dni:string; this.edad = 0;
nombre:string; this.dni = dni;
this.nombre = nombre;
constructor(dni:string, nombre:string){ }
this.dni=dni; return Persona;
this.nombre=nombre; }());
} var yo = new Persona("1", "Romeo");
} var tu = new Persona("2", "Julieta");
Fuente:
http://www.typescriptlang.org/play/index.html
13. Propiedades privadas en JavaScript (parte 2 de
2)
<script> Definición de
function Explosivo(){ propiedad privada Salida en
var maneraDetonar='correr'; con la palabra
this.maneraDetonar2=''; Pantalla
reservada var.
this.nombre='';
this.componentePrincipal='';
this.detalleExplosivo=function(nombre,componente){
this.nombre=nombre;
this.componentePrincipal=componente;
}
</script>
Información adicional: Se pueden definir las variables que son pensadas como privadas con una nomenclatura
como: this._maneraDetonar, el guion bajo da a entender que su propósito es privado aunque a nivel técnico en
realidad es una propiedad pública.
14. Métodos estáticos en JavaScript
<script>
function Persona(){
if (Persona.numeroObjetos)
{Persona.numeroObjetos++;} Método asociado solo a la
else { clase y no a las instancias.
Persona.numeroObjetos = 1;
}
//Métodos de instancia
this.saluda=function(){
return 'Hola soy la persona Nro.: '+Persona.numeroObjetos;
}
};
</script>
15. Métodos públicos en JavaScript (definición interesante
de método público usando la palabra reservada var)
<script>
function Mama(){
this.ledicetodoelmundo = "Señora"; Todo lo que no esté declarado
var ledicenhijos = "Mamá";
}; en this se ejecuta dentro de la
var Papa=function(){ función pero no es accesible
var _api = {};
_api.ledicetodoelmundo = "Señor"; desde fuera como en el caso de
var ledicenhijos = "Papá"; ledicenhijos.
return _api;
}
init();
es mas que aconsejable utilizar un método
};
return _api; init declarado al principio de nuestra clase
var Auxilia = new Mama();
y llamado justo antes del final. De esta
Aunque en estos ejercicios manera nos aseguramos que cuando
console.log(Auxilia.ledicetodoelmundo);
console.log(Auxilia.ledicenhijos); se demuestra el uso de una accedemos al objeto éste está
var Wilfrido = new Papa(); variable _api para la perfectamente montado y podemos
console.log(Wilfrido.ledicetodoelmundo);
console.log(Wilfrido.ledicenhijos); definición de propiedades y acceder a sus variables y métodos sin
var Jimena = new Hermana(); métodos públicos, otra problemas.
console.log(Jimena.edad);
console.log(Jimena.metodoPublico()); forma sencilla de hacerlo es
</script> con .this.
16. Métodos privados en JavaScript
Son funcionalidades usadas desde dentro de una clase, sin que forme parte (visible desde
<script> luego, porque esta en el trabajo interno de la misma) del conjunto de métodos a
function PantallaLogueo(){
los cuales puede acceder una instancia de clase.
var _this=this;
var Estado="Sin definir";
Método NO accesible desde instancia (porque no tiene this.
function llamadaMetodoPrivado(){ Al inicio de function), no funcionaria por ejemplo si se prueba:
_this.metodoPublicoAutenticar(); aplicacionX. LLamaraPublicoDesdePrivado();
} En conclusión con esta definición se tiene un método privado.
this.metodoPublicoAutenticar=function (){
Estado="Autenticando clase"; Se esta llamando a un público
} método
metodoPublicoAutenticar desde
privado llamadaMetodoPrivado.
un Estométodo
es posible
this.metodoPublicoAutenticarInstancia=function(){
//Estado="Autenticando instancia...";
por var _this=this; que esta haciendo accesible
llamadaMetodoPrivado(); a this en los métodos privados a través de
} _this.
<script>
var Persona = function(options){
//Propiedades privadas
var nombre = options.name;
var anioNacimiento = options.birthYear;
//Método privado
var calcularEdad = function(){
var fecha = new Date();
return fecha.getFullYear() - anioNacimiento;
}
Una representación práctica de los métodos
//Métodos Privilegiado
privilegiados son los métodos getter y setter, lo
this.getEdad = function(){
mismos como en este caso al estar en la definición
return calcularEdad(); //Llamada al método privado
del constructor tienen acceso a métodos y
}
propiedades privadas: calcularEdad, Nombre,
anioNacimiento.
this.getNombre=function(){
return nombre;
}
}
//Instancia de persona
var p = new Persona({name:'Robert', birthYear:1983});
console.log('Hola '+p.getNombre()+' Tienes la tierna edad de '+p.getEdad()+' Años');
</script>
18. Herencia: ¿Cómo funcionan los prototipos en JavaScript?
console.log(gato1.constructor);
</script> PASO 3. Si no se ubica esta línea con cada
instancia de la clase Gato usará el constructor
de la clase Mascota.
Justo después de sobreescribir el prototype
es donde hay que hacer esa corrección.
20. Polimorfismo en JavaScript (PARTE 1 DE 3).
index.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script src="js/miapp_actualizar_estado_carro.js"></script> 1
<script src="js/carro.js"></script> 2
<script src="js/carro_automovil.js"></script> 3
<script src="js/carro_camioneta.js"></script> 4
<script>
var app=new MiApp();
app.crearCarro();
console.log(app); Salida en
console.log(app.carro); ejecución
app.actualizarEstado(MiApp.CAMIONETA);
console.log(app.carro);
</script>
</body>
</html>
20. Polimorfismo en JavaScript (PARTE 2 DE 3).
miapp_actualizar_estado_carro.js Este bloque de carro.js
function MiApp(){ código es
polimórfico puesto function Carro(){
this.carro=null;
que llama métodos this._tipoCarro='';
}
para una instancia
MiApp.AUTOMOVIL='AUTOMOVIL' }
de tipo carro sin
;MiApp.CAMIONETA='CAMIONETA'; importar si sean
de la clase Carro.prototype.setTipoCarro=function(tipocarro){
MiApp.prototype.crearCarro=function(){ CarroAutomovil o this._tipoCarro=tipocarro;
this.actualizarEstado(MiApp.AUTOMOVIL); CarroCamioneta. }
}
Carro.prototype.getTipoCarro=function(){
MiApp.prototype.actualizarEstado=function(tipocarro){ return this._tipoCarro;
if(this.carro===null || tipocarro!==this.carro.getTipoCarro()){ }
if(this.carro!=null)
{ Carro.prototype.ingresarDatosCarro=function(){
this.carro.ingresarDatosCarro(); //Codigo con indicaciones para ingresar un carro
this.carro.ingresarDatosMantenimiento(); }
}
Carro.prototype.ingresarDatosMantenimiento=function(){
switch(tipocarro) //Codigo con indicaciones para mantenimiento
{ }
case
MiApp.AUTOMOVIL:
this.carro=new CarroAutomovil(); Carro.prototype.retornarDatosaJason=function(){
break; //Codigo con indicaciones para retornar codigo JASON
case MiApp.CAMIONETA: }
this.carro=new CarroCamioneta();
break; El polimorfismo asegura que todos los métodos que se van a
usar siempre van a estar disponibles, en este caso los métodos
}
están disponibles para instancias de tipo CarroAutomovil y
this.carro.retornarDatosaJason(); CarroCamioneta.
}
}
20. Polimorfismo en JavaScript (PARTE 3 DE 3).
carro_automovil.js
function CarroAutomovil(){
}
CarroAutomovil.prototype = new Carro();
CarroAutomovil.prototype.constructor=CarroAutomovil; Estas funciones son hechas nada más
para demostrar la capacidad de
instancias de estas clases en usar
métodos de la clase padre como:
- ingresarDatosCarro
- ingersarDatosMantenimiento.
carro_camioneta.js
- retornarDatosaJason.
function CarroCamioneta(){
}
CarroCamioneta.prototype = new Carro();
CarroCamioneta.prototype.constructor=CarroCamioneta;
21. Composición y agregación (parte 1 de
2).
Agregación
<script>
Definición function Agenda(){
this.contacto1=new Contacto('mama','casa');
Es muy similar a la relación de this.contacto2=new Contacto('papa','casa');
Asociación solo varía en la multiplicidad }
ya que en lugar de ser una relación "uno function Contacto(nombre, direccion){
a uno" es de "uno a muchos". this.nombre=nombre;
Representación UML this.direccion=direccion;
Se representa con una flecha que parte }
de una clase a otra en cuya base hay
var agendaUsuario=new Agenda();
un rombo de color blanco.
console.log(agendaUsuario);
</script>
<script> <script>
var mujer={ var mujer={
nombre: '', nombre: '',
presentarse: function(){
Usa object.create presentarse: function(){
console.log("Hola me llaman "+this.nombre); totalmente para la console.log("Hola me llaman "+this.nombre);
} }
};
herencia };