Fundamentos
de JavaScript
¿ Qué es JavaScript ?
Es un lenguaje de programación diseñado principalmente
para agregar comportamiento dinámico a una página web.
Todos los navegadores modernos interpretan el código JavaScript integrado en una página web.
Hoy en día, es posible utilizar totalmente JavaScript para construir nuestro contenido web.
Caracteristicas
- Fácil de aprender y hacer andar.
- Flexible.
- Cambiante y en constante crecimiento. (ECMAScript).
- Dificil de dominar.
Paradigma de Programación
- Es un estilo de desarrollo de programas
- Es la forma es la que pensamos cómo resolver una determinada problemática
Formalmente lo podemos definir cómo:
" Un conjunto de creencias, prácticas y conocimientos que guían el desarrollo de una disciplina en un periodo de tiempo"
De una manera más conceptual, lo definimos de la siguientes maneras:
Tipos de Paradigmas
de Programación
- Orientado a Objectos
- Funcional
- Imperativo
- Declarativo
- Procedural
- Dirigida por eventos
- ...etc
Tipos de Paradigmas
de Programación que maneja JavaScript
- Orientado a Objectos
- Funcional
- Imperativo
- Declarativo
- Procedural
- Dirigida por eventos
- ...etc
Variables
Una variable no es más que un espacio en memoria reservado para almacenar información, estos espacios pueden ser de tipo dinamico o estatico, lo cual depende del lenguaje.
Particularmente JavaScript, al ser un lenguaje NO TIPADO, una variable puede almacenar un número y más tarde almacenar en la misma variable una frase.
Un lenguaje tipado es aquel donde una variable es de un solo tipo y mientras exista, no puede guardar valores de otro tipo sin cambiar antes su tipado a traves de funciones.
Tipos de Variables
Las variables que maneja internamente JavaScript son:
- number (números)
- string (texto)
- null (valor desconocido)
- undefined (sin valor asignado aún)
- object (objeto)
Parte del nuevo estándar ECMAScript 2015 (ES6) define un nuevo tipo:
- Symbol (valor único e inmutable)
Objetos
Los objetos son uno de los tipos más utilizados a la hora de construir programas.
Permite contener más valores dentro de sí mismo, normalmente llamadas propiedades.
Text
var persona = {
nombre: 'Daniel'
apellido: 'Mata'
extranjero: true,
identifica: function() {
console.log("Soy una persona");
}
};
Un ejemplo de un objeto sería el siguiente:
Propiedades
Objeto
Acceso a sus propiedades
Para acceder a las propiedades de un objeto lo hacemos así:
persona.nombre // Daniel
persona.apellido // Mata
persona.extranjero // true
Constructor
Definición de un Objeto genérico
Muchas veces queremos crear varias instancias de un mismo objeto, en este caso, queremos crear varias instancias de Persona. Para ello hacemos lo siguiente;
// Nos permite crear instancias de objetos Persona
function Persona(nombre, apellido, extranjero) {
this.nombre = nombre;
this.apellido = apellido;
this.extranjero = extranjero;
}
// Instanciamos dos objetos
var alguien = new Persona('Juan', 'Perez', false);
var montoto = new Persona('Montoto', '', false);
// Ahora accedemos a el nombre y apellido
alguien.nombre // Juan
what is this ?
Es una palabra reservada dentro del lenguaje.
El this nos permite definir el contexto donde se ejecuta una función.
En el ejemplo anterior, lo que estamos haciendo es establecer que las nuevas variables (nombre, apellido, extranjero) pertenecen al contexto en el que se ejecuta la funcion.
Método .bind()
Imaginemos que tenemos la siguiente función:
var alguien = new Persona('Juan', 'Perez', false);
function imprimirNombre() {
console.log(this.nombre + ' ' + this.apellido);
}
imprimirNombre(); // undefined undefined
Lo que sucedió es que la función imprimirNombre no tiene un contexto de ejecución asociado. Para resolverlo, hacemos:
var alguien = new Persona('Juan', 'Perez', false);
function imprimirNombre() {
console.log(this.nombre + ' ' + this.apellido);
}
imprimirNombre.bind(alguien)(); // Juan Perez
¿ Qué es el .bind(context) ?
El método bind() crea una nueva función, que cuando es llamada, asigna a su operador this el valor entregado, con una secuencia de argumentos dados precediendo a cualquiera entregados cuando la función es llamada.
Es importante el uso del .bind() porque cada función tiene su propio contexto determinado, y es necesario especificarlo de manera implícita antes de llamar a un método que use valores asociados al this
apply / call vs bind
Los dos se utilizan para asociar un determinado contexto a una función. La principal diferencia es:
- apply / call
- bind
apply: permite llamar a una función pasándole un contexto y una seria de parámetros en forma de array
call: permite llamar a una función pasándole un contexto y una seria de parámetros individualmente
Te devuelve una nueva función con un contexto asignado
Prototipos en JavaScript
JavaScript es un lenguaje que utiliza objetos, pero que en lugar de estar basado en clases, se basa en prototipos. Debido a esta diferencia, puede resultar menos evidente que JavaScript te permite crear jerarquías de objetos y herencia de propiedades y de sus valores.
Un prototipo es un objeto del cual otros objetos heredan / delegan sus propiedades
Todos los objetos tienen asociado un prototipo por defecto
Clases en JavaScript
Una clase es una "plantilla" para definir objetos. Se usan para representar entidades o conceptos de la realidad.
En el nuevo estándar de JavaScript (ES6 o ECMAScript 2015) se introdujo el concepto de clases para definir objetos.
Es una mejora sintáctica mucho mas clara y simple para proveer herencia basada en prototipos. Es importante aclarar que las clases NO introducen un nuevo modelo de herencia o delegación
Definiendo prototipos
Recordando el ejemplo anterior, en donde definimos una Persona. Supongamos que queremos mostrar el nombre completo para todos los objetos del tipo Persona.
function Persona(nombre, apellido, extranjero) {
this.nombre = nombre;
this.apellido = apellido;
this.extranjero = extranjero;
}
Persona.prototype.mostrarNombre = function() {
console.log(this.nombre + " " + this.apellido);
};
var alguien = new Persona('Juan', 'Perez', false);
alguien.mostrarNombre(); // Juan Perez
La funcion Persona, no posee en su definicion, la funcion mostrarNombre.
Pero puede usarla porque esta definido en su prototipo.
Delegando prototipos
Ahora se nos pide definir un tipo de objeto Empleado. El empleado tiene la misma definición que una Persona pero con un sueldo asociado. Entonces, el nuevo tipo va a ser una "herencia" de Persona en conjunto con sus propios atributos y métodos.
function empleado(nombre, apellido, extranjero, sueldo) {
persona.call(this, nombre, apellido, extranjero);
this.sueldo = sueldo;
};
empleado.prototype = Object.create( Persona.prototype );
empleado.prototype.calcularAguinaldo = function() {
console.log(this.sueldo/2);
};
var yo = new empleado('daniel', 'mata', true, '52000');
yo.mostrarNombre(); // daniel Mata
yo.calcularAguinaldo(); // 26000
console.log(yo.extranjero) // true
Delegando prototipos
Esta Cadena de prototipado puede llegar tan lejos como lo
requiera el programa, mas adelante es necesario declarar una variable para jubilados y una forma de calcular su jubilacion
function jubilado(nombre, apellido, años, sueldo) {
persona.call(this, nombre, apellido);
this.años = años;
this.sueldo = sueldo;
}
jubilado.prototype = Object.create( empleado.prototype );
jubilado.prototype.calcularJubilacion = function() {
console.log(this.sueldo * this.años)
};
var abuela = new jubilado('edna', 'cortez', '20', '10000');
abuela.mostrarNombre(); // edna cortez
abuela.calcularAguinaldo(); // 5000
abuela.calcularJubilacion(); // 200000
Cadena de prototipado
Persona
Jubilado
Yo
Empleado
Alguien
Abuela
Object.prototype
Gracias a todos
Happy Hacking!
deck
By Mariano Furriel
deck
- 485