jueves, 16 de diciembre de 2010

POO en Javascript (III)

En anteriores post abordamos algunos de los conceptos más importantes a la hora de enfrentarnos a la la programación orientada a objetos en javascript, ver Parte 1 y Parte 2.

Para terminar con este tema y antes de introducirnos de lleno con ASP.NET AJAX, hay 2 objetos de javascript que merecen una explicación personalizada porque serán muy útiles en un contexto de POO. Estoy hablando de los objetos Function y Object.

La principal propiedad de Function es prototype. De prototype ya está todo dicho en los anteriores post, pero encontramos otras propiedades que también podrían resultarnos útiles:

arguments. Variable local que es un array que almacena los argumentos pasados a la función.

length. Devuelve el número de parámetros definidos para la función.

caller. Devuelve la función desde la que está siendo llamada la función. En caso de estar siendo llamada al más alto nivel, devuelve null. Esta propiedad nos ayuda a determinar el “contexto” en el que se está ejecutando nuestra función.

        function prueba(a, b, c) {           

            alert("La función espera recibir " + prueba.length + " parámetros."); //3

            alert("La función ha recibido " + arguments.length + " parámetros."); //2

                                           

            //iterar sobre los argumentos recibidos

            for (var i = 0; i < arguments.length; i++) {

                alert(arguments[i]);

            }

           

            //callee es la propia función que está siendo llamada.

            alert(arguments.callee.toString());

 

            //null para la primera llamada, prueba2 para la segunda.

            alert(prueba.caller);

        }

 

        prueba(5, 10);

 

        function prueba2() {

            prueba(5, 10);

        }

        prueba2();

 

Ver que arguments además de ser un array con los argumentos pasados a la función, también tiene una propiedad callee que es la propia función siendo llamada. Por ejemplo, para funciones recursivas donde la función es anónima y no tiene nombre, puede suponer la posibilidad de llamarse a sí misma.

Por otro lado está Object que tiene las siguientes propiedades:

hasOwnProperty(prop). Determina si para un objeto existe una propiedad determinada. La propiedad no puede ser heredada (no prototype chaining ¿te acuerdas?). Cabe mencionar que si la propiedad es directa (no heredada) da igual como haya llegado ahí (si por el constructor, por prototype, de forma dinámica, etc.)

isPrototypeOf(o). Devuelve si un objeto es el prototipo de otro. Por ejemplo, si “Programador” hereda de “Persona” (a través de prototype chaining), la instrucción Persona.prototype.isPrototypeOf(Sergio) devuelve true, asumiendo que var Sergio = new Programador();

propertyIsEnumerable(prop). Devuelve true si la propiedad es enumerable a través de una instrucción for…in. Si la propiedad no existe, es heredada de prototype (ya sea de base o a través de prototype chaining) o es una función o propiedad “pre-built” devuelve false.

        function Persona() {

            this.nombre = "";

        }

 

        function Programador() {

            this.lenguajePreferido = "";

        }

 

        Programador.prototype = new Persona();

 

        Programador.prototype.compilacionesPorDia = 0;

 

        var sergio = new Programador();

 

        alert(sergio.propertyIsEnumerable("nombre")); //false

        alert(sergio.propertyIsEnumerable("lenguajePreferido")); //true.

        alert(sergio.propertyIsEnumerable("compilacionesPorDia")); //false

        alert(sergio.propertyIsEnumerable("toString")); //false

 

Un saludo!

No hay comentarios:

Publicar un comentario