JavaScript como Orientación a Objetos

Documentos relacionados
Introducción a PHP. * No es necesario declarar previamente las variables.

Curso PHP Módulo 1 R-Luis

Capitulo III. Diseño del Sistema.

Internet Information Server

Curso de PHP con MySQL Gratis

Curso de Java POO: Programación orientada a objetos

Que es PHP? Que se puede hacer con PHP? Sintaxis del lenguaje. Variables. Operadores básicos. Condicionales. Ciclos.

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

La utilización de las diferentes aplicaciones o servicios de Internet se lleva a cabo respondiendo al llamado modelo cliente-servidor.

PROGRAMACIÓN PÁGINAS WEB CON PHP

Notación UML para modelado Orientado a Objetos

INTRODUCCIÓN A PHP. Javier Enciso

Programa. Conceptos básicos: variables, valores y objetos predefinidos, operadores, etc. etc. Callbacks, eval(), etc.

UNIVERSIDAD CATOLICA DE COLOMBIA FACULTAD DE INGENIERIA DE SISTEMAS

TIPOS DE VARIABLES EN PHP. DECLARACIÓN Y ASIGNACIÓN. LA INSTRUCCIÓN ECHO PARA INSERTAR TEXTO O CÓDIGO. (CU00816B)

AGREGAR COMPONENTES ADICIONALES DE WINDOWS

La plantilla propone aprovechar esta estructura en común y sólo modificar el contenido del área del documento que sea diferente.

Introducción a la programación orientada a objetos

Capítulo 1 Documentos HTML5

Tutorial de UML. Introducción: Objetivos: Audiencia: Contenidos:

GUÍA Nro. 1 TECNOLOGÍA DE INTERNET. TIII PIII

GENERAR DOCUMENTOS HTML USANDO LENGUAJE PHP. EJERCICIO RESUELTO EJEMPLO SENCILLO. (CU00733B)

JavaScript,, AJAX y otras tecnologías web. Área de Ingeniería Telemática

Java Inicial (20 horas)

Introducción. Ciclo de vida de los Sistemas de Información. Diseño Conceptual

Introducción a la Firma Electrónica en MIDAS

Capítulo I. Marco Teórico

EXTENSIÓN DE UML PARA APLICACIONES WEB

TUTORIAL DE PHP. M. en C. Erika Vilches. Parte 2.

Conceptos. ELO329: Diseño y Programación Orientados a Objetos. ELO 329: Diseño y Programación Orientados a Objetos

GeneXus BPM Suite X. Última actualización: 01 de Setiembre de 2008

Capacitación Rational Funcional Tester

2.2.- Paradigmas de la POO

Capítulo VI. Conclusiones. En este capítulo abordaremos la comparación de las características principales y

Creación de Funciones de Conducción

APLICACIONES PARA INTERNET

JavaScript toma su sintaxis de los lenguajes de programación más conocidos, fundamentalmente C/C++, aunque también algo de Pascal.

Visual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario

RECUPERAR DATOS DE UN FORMULARIO HTML USANDO PHP. USO DE $_GET. EJEMPLOS Y EJERCICIOS RESUELTOS. (CU00833B)

Generador de Proxy remoto JavaScript.

Ciclo de vida y Metodologías para el desarrollo de SW Definición de la metodología

Aplicaciones Web con Delphi

UNIDAD 2: Abstracción del Mundo real Al Paradigma Orientado a Objetos

Capitulo VI. Conclusiones.

CAPÍTULO VI PREPARACIÓN DEL MODELO EN ALGOR. En este capítulo, se hablará acerca de los pasos a seguir para poder realizar el análisis de

7. CONCLUSIONES Y TRABAJOS FUTUROS

TUTORIAL DE PHP. M. en C. Erika Vilches. Parte 1.

Workflows? Sí, cuántos quiere?

Capítulo 6. Introducción a la POO

DIAGRAMA DE CLASES EN UML

CLASS JAVASCRIPT CLASES? OBJETOS PREDEFINIDOS. WINDOW, OBJETO GLOBAL. NUMBER, MATH, DATE, REGEXP, ERROR. (CU01144E)

Manual del programador

Programación Orientada a Objetos en Java

Plataforma e-ducativa Aragonesa. Manual de Administración. Bitácora

MANUAL DE USUARIO IMPORTADOR DE FICHERO DE USUARIOS EN EL SERVIDOR DE CENTRO

Manejo de versiones 392

Capitulo 5. Implementación del sistema MDM

Workflow, BPM y Java Resumen de la presentación de Tom Baeyens

Arquitectura de Aplicaciones

Hi-Spins. Hi-Spins - Novedades v

Modulo 1 El lenguaje Java

Oprime click para iniciar

PHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases

Parámetros con la ventana de selección de usuario, reglas, texto y descomposición (IVE)

Funciones, x, y, gráficos

Edición de Ofertas Excel Manual de Usuario

SERVICE ORIENTED ARCHITECTURE (SOA) CONTENIDO

M III ABSTRACCIÓN Y CLASIFICACIÓN

Tutorial: Primeros Pasos con Subversion

15 CORREO WEB CORREO WEB

PowerPoint 2010 Modificar el diseño de las diapositivas

PHP Básico. PHP para principiantes

ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Programación de sitios web Act 4: Lección Evaluativa 1

Práctica 6 - Página Web

Diseño de páginas web 2011

SUBIR ARCHIVOS CON FTP. TRABAJAR EN UN SERVIDOR REMOTO. CREAR UNA PÁGINA WEB CON PROGRAMACIÓN PHP. (CU00814B)

ENTORNO DE DESARROLLO MICROSOFT.NET 2010

Kaldeera Advanced Forms 2009 Guía del usuario

7. Motores de Búsqueda en Internet

RESUMEN INFORMATIVO PROGRAMACIÓN DIDÁCTICA CURSO 2013/2014

Curso de Python Inicial

BANNERS CÍCLICOS CON JAVASCRIPT

Qué necesito saber para tener mi sitio web en Internet?

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

Instalar y configurar W3 Total Cache

Comenzando con MATLAB

Elementos requeridos para crearlos (ejemplo: el compilador)

CAPÍTULO 3 Servidor de Modelo de Usuario

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib

Adaptación al NPGC. Introducción. NPGC.doc. Qué cambios hay en el NPGC? Telf.: Fax.:

Gestión de Permisos. Bizagi Suite. Copyright 2014 Bizagi

MANUAL DE USUARIO. Webservice simple para la exportación rápida de información proveniente de una base de datos. Versión 0,1,1

Acronis License Server. Guía del usuario

Host. En este texto, entenderemos por host toda máquina - léase computadora. Cuenta. Una cuenta, en general, es un espacio de memoria y de disco que

La interoperabilidad se consigue mediante la adopción de estándares abiertos. Las organizaciones OASIS y W3C son los comités responsables de la

Instalar protocolo, cliente o servicio nuevo. Seleccionar ubicación de red. Práctica - Compartir y conectar una carpeta

Almacenamiento virtual de sitios web HOSTS VIRTUALES

Transcripción:

Gustavo Lacoste (gustavo@lacosox.org) October 2012 Resumen El objetivo de las siguientes notas es generar una estructura en JavaScript que nos permita reutilizar de manera limpia las funciones creadas en otros ficheros JavaScript, para esto reorganizaremos el código intentando aproximarnos al concepto de clase tomando como base su implementación en el lenguaje de programación orientado a objetos PHP. Palabras Clave: JavaScript, Orientación a Objetos, JSON, Funciones anónimas, Funciones autoejecutables, PHP. JavaScript NO es un lenguaje Orientado a Objetos, es en realidad el único lenguaje de programación basado en herencia de prototipos [2]. A pesar que encontramos el uso de los operadores new y this dentro de códigos JavaScript, estos operadores no hacen exactamente lo mismo que en los lenguajes Orientados a Objetos. Por una parte this en realidad cambia su comportamiento dependiendo del contexto y por otra parte new genera una instancia del objeto referido aunque la instancia puede ser extendida en el futuro mediante el uso de prototype, estos operadores actúan como una fachada que hace parecer el lenguaje como orientando a objetos aún cuando su funcionamiento es diferente al de los lenguajes Orientado a Objetos tradicionales. La razón por la cual JavaScript intenta esconder su verdadera naturaleza detrás de una fachada clásica de POO es la complejidad que representa la comprensión de un nuevo paradigma particular para este lenguaje. La idea de disfrazar el uso de JavaScript bajo la apariencia típica del paradigma Orientado a Objetos no es nueva, por un lado la academia clásica enseña a los nuevos programadores todos los conceptos clásicos de Orientación a Objetos y modelado de software (mediante UML [3]), dejando poco espacio para la discusión de otros paradigmas; parece lógico entonces intentar disfrazar JavaScript con la apariencia de POO en post de una comprensión más rápida y práctica del lenguaje. A continuación intentaremos mostrar una sintáxis que se asimile lo más posible a la clásica orientación a objetos utilizando los elementos existentes en JavaScript. En UML (Unified Modeling Language) una forma básica para representar la clase Persona sería: 1

Según este diagrama una clase (molde) para construir objetos Personas se caracteriza entre otras cosas por: El atributo nombre de tipo String y de acceso privado (es decir sólo puede ser accedido y modificado por métodos de la propio objeto que se cree a partir de la clase) de la misma forma el método pensar() sólo puede ser llamado desde métodos de la clase. Los métodos setnombre y getnombre son públicos es decir pueden ser llamados desde fuera de la clase, en la práctica dichos métodos que serán parte del objeto que instanciemos a partir de la clase podrán ser visibles desde otros objetos pero no así aquellos atributos o métodos privados. Para realizar una comparación realista vamos a escribir la clase con uno de los lenguajes Orientados a Objetos más utilizados por los desarrolladores web: PHP (acrónimo de PHP: Hypertext Preprocessor). PHP es básicamente un lenguaje de scripting diseñado para generar código HTML y enviarlo al navegador web del cliente, es por tanto un lenguaje de programación que se utiliza de lado del servidor. El caso de PHP es diferente, dado que el lenguaje fué originalmente diseñado para realizar scripts estructurados, en PHP es posible programar tanto de manera estructurada como Orientada a Objetos. En siguiente código representa la declaración de la clase Persona en PHP: 1 <?php Listing 1: persona.php 2 c l a s s Persona { 3 p r i v a t e $nombre ; 4 p u b l i c f u n c t i o n getnombre ( ) { 5 $ t h i s >pensar ( Entrego mi nombre<br/> ) ; 6 r eturn $ t h i s >nombre ; 7 } 8 p u b l i c f u n c t i o n setnombre ( $nombre ){ 9 $ t h i s >pensar ( Cambio mi nombre<br/> ) ; 10 $ t h i s >nombre=$nombre ; 11 } 12 p r i v a t e f u n c t i o n pensar ( $pensamiento ){ 13 echo $pensamiento ; 15 }

17 $gustavo = new Persona ( ) ; 18 $gustavo >setnombre ( Gustavo ) ; 19 echo Mi nombre e s. $gustavo >getnombre ( ). <br/> ; 20 21 $ j u a n e l o = new Persona ( ) ; 22 $juanelo >setnombre ( Juan ) ; 23 echo Mi nombre es. $juanelo >getnombre ( ). <br/> ; 24?> en esta implementación mediante PHP podemos diferenciar claramente la declación de las variables y métodos. A diferencia en el caso de JavaScript los objetos pueden contener sus propios métodos sin necesidad de clases. Quizá una de las formas más simples de generar una estructura similar a la anterior en JavaScript es hacer uso de la notación literal de declaración de objetos en la que un objeto es declarado como un conjunto desordenado de pares nombre/valor. En esta forma de declaración de un objeto a menudo conocida como JSON[1], un objeto comienza con (llave de apertura) y termina con (llave de cierre). Cada nombre es seguido por : (dos puntos) y los pares nombre/valor están separados por, (coma). El flujo se ve representado en el siguiente diagrama: Siguiendo esta lógica podríamos declarar un objeto de forma literal en JavaScript. Además una particularidad de JavaScript es la de asignar una función al valor de una variable, puediendo esta ser incluso anónima por lo tanto podríamos tomar esta estructura y asignar a las variables que deseamos ver como métodos una función en lugar de un valor fijo (String, entero, etc) de esta forma podríamos llamar a esta función anónima llamando en realidad al nombre de la variable a la cual le asignamos la función anónima. Otra característica interesante del uso de funciones en JavaScript es que nos permite pasar funciones como parámetros a otras funciones, y obtener funciones como resultados de la ejecución de una función. La implementación quedaría como sigue:

1 Listing 2: persona.js 2 var Persona = { 3 nombre : "", 4 getnombre : function ( ) { 5 this. pensar ( Entrego mi nombre <br/> ) ; 6 return this. nombre ; 7 }, 8 setnombre : function ( nombre ){ 9 this. pensar ( Cambio mi nombre <br/> ) ; 10 this. nombre=nombre ; 11 }, 12 pensar : function ( pensamiento ){ 13 document. w r i t e ( pensamiento ) ; 15 } ; 17 Persona. setnombre ( " Gustavo " ) ; 18 document. w r i t e ( Mi nombre es +Persona. getnombre ( ) ) ; Listing 3: persona adv.php 1 <?php 2 c l a s s Persona { 3 p r i v a t e $nombre ; 4 p u b l i c f u n c t i o n getnombre ( ) { 5 $ t h i s >pensar ( Entrego mi nombre<br/> ) ; 6 r e t u r n $ t h i s >nombre ; 7 } 8 p u b l i c f u n c t i o n setnombre ( $nombre ){ 9 $ t h i s >pensar ( Cambio mi nombre<br/> ) ; 10 $ t h i s >nombre=$nombre ; 11 } 12 p r i v a t e f u n c t i o n pensar ( $pensamiento ){ 13 echo $pensamiento ; 15 } 17 $gustavo = new Persona ( ) ; 18 $gustavo >setnombre ( Gustavo ) ; 19 echo Mi nombre e s. $gustavo >getnombre ( ). <br/> ; 20 21 $ j u a n e l o = new Persona ( ) ; 22 $juanelo >setnombre ( Juan ) ; 23 echo Mi nombre e s. $juanelo >getnombre ( ). <br/> ; 24?> 1 <html> 2 <head> Listing 4: index.html 3 <script type= t e x t / j a v a s c r i p t src= persona. j s ></ script> 4 </head> 5 <body> 6 </body> 7 </html>

Resultado de la ejecución con JavaScript: Resultado de la ejecución con PHP: Si bien con ambas implementaciones (en PHP y en JavaScript) se obtiene el mismo resultado (para un único objeto) la implementación en JavaScript es sólo una declaración de un objeto. Esto significa que no existe un molde desde el cual generamos los objetos sino que simplemente delcaramos un objeto inmeditamente, por otra parte también observamos que todos los métodos son de hecho públicos, necesitamos que al igual que en PHP la implementación del método pensar sea accesible sólo por el propio objeto y no de forma pública. Si bien la forma de declaración de objetos de JavaScript es la más simple y fácil de comprender sobre todo por su relación directa con el formato JSON no es la forma más conveniente de hacerlo para este caso dado que los nombres de los atributos son siempre públicos. Una forma simple de acernos aún más es hacer uso de las funciones autoejecutables de JavaScript (function()...)();, este tipo de funciones se ejecutan automáticamente al ser interpretadas y nos servirán para hacer uso del operador new de JavaScript de tal forma que la función autoejecutable retorne en realidad un objeto con los métodos públicos que queremos que sean visibles solamente, manteniendo en su interior los métodos privados. La implementación basado en esta idea quedaría así:

Listing 5: persona adv.js 1 window. Persona = window. Persona { } ; 2 window. Persona = ( function ( ) { 3 " use strict " ; 4 5 function Persona ( ) { 6 } 7 var nombre = "" ; 8 9 Persona. prototype. getnombre = function ( ) { 10 pensar ( Entrego mi nombre <br/> ) ; 11 return this. nombre ; 12 } ; 13 14 Persona. prototype. setnombre = function ( nombre ) { 15 pensar ( Cambio mi nombre <br/> ) ; this. nombre=nombre ; 17 } ; 18 19 function pensar ( pensamiento ){ 20 document. w r i t e ( pensamiento ) ; 21 } 22 23 return Persona ; 24 } ( ) ) ; 25 26 var gustavo = new Persona ( ) ; 27 gustavo. setnombre ( " Gustavo " ) ; 28 document. w r i t e ( Mi nombre es +gustavo. getnombre ()+ <br/> ) ; 29 30 var j u a n e l o = new Persona ( ) ; 31 j u a n e l o. setnombre ( " Juan " ) ; 32 document. w r i t e ( Mi nombre es +j u a n e l o. getnombre ()+ <br/> ) ; Listing 6: persona adv.php 1 <?php 2 c l a s s Persona { 3 p r i v a t e $nombre ; 4 p u b l i c f u n c t i o n getnombre ( ) { 5 $ t h i s >pensar ( Entrego mi nombre<br/> ) ; 6 r e t u r n $ t h i s >nombre ; 7 } 8 p u b l i c f u n c t i o n setnombre ( $nombre ){ 9 $ t h i s >pensar ( Cambio mi nombre<br/> ) ; 10 $ t h i s >nombre=$nombre ; 11 } 12 p r i v a t e f u n c t i o n pensar ( $pensamiento ){ 13 echo $pensamiento ; 15 } 17 $gustavo = new Persona ( ) ; 18 $gustavo >setnombre ( Gustavo ) ; 19 echo Mi nombre e s. $gustavo >getnombre ( ). <br/> ; 20 21 $ j u a n e l o = new Persona ( ) ; 22 $juanelo >setnombre ( Juan ) ; 23 echo Mi nombre e s. $juanelo >getnombre ( ). <br/> ; 24?>

Esta nueva versión presentada es bastante más compleja que la anterior e introduce algunos conceptos que vale la pena destacar como son: Funciones anónimas: son funciones sin nombre que se pueden asignar a una variable directamente y ser llamar a estas variables para invocar a la función. Extención de un objeto dinámicamente: se puede extender un objeto en tiempo de ejecución mediante prototype. si observamos la primera línea window.persona es básicamente la declaración de un objeto que luego mediante la asignación de una función anónima implementa en su interior un nuevo objeto del mismo nombre que se va extendiendo hasta ser retornado. Este efecto produce que al llamar a la función window.persona este método funcione en realidad como una fábrica de objetos lo que finalmente usaremos para generar 2 objetos en memoria que con valores diferentes en sus atributos. La particularidad que tiene esta forma de escribir una similitud a una clase es que el método pensar efectivamente sólo puede ser llamado desde métodos internos dentro de la fábrica, o entre comillas dentro de la clase lo cual es bastante similar a los métodos privados que observamos en la implementación mediante PHP. Referencias [1] D Crockford. The application/json media type for javascript object notation (json). 2006. [2] S Ecma. ECMA-262 ECMAScript Language Specification, 2009. [3] Object Management Group. OMG Unified Modeling Language (TM) Superstructure Version 2.3, 2010.