23 |
24 |
25 |
26 |
27 |
28 |
31 |
32 |
33 | ```
34 |
35 | #### Desarrollo
36 |
37 | Reemplazar todas las imágenes del documento (etiquetas ``) con el texto que contienen en el atributo `alt`.
38 |
39 |
40 | Solución
41 |
42 | ```javascript
43 | var images = document.body.getElementsByTagName("img");
44 | for (var i = images.length - 1; i >= 0; i--) {
45 | var image = images[i];
46 | if (image.alt) {
47 | var text = document.createTextNode(image.alt);
48 | image.parentNode.replaceChild(text, image);
49 | }
50 | }
51 | ```
52 |
53 |
54 |
--------------------------------------------------------------------------------
/Sesion-04/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Extraer una lista de propiedades
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento de funciones y ciclos para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Completar la función `pluck` que extrae una lista de propiedades de un arreglo de objetos.
18 |
19 | ```javascript
20 | var singers = [
21 | { name: 'Steven Tyler', band: 'Aerosmith', born: 1948 },
22 | { name: 'Karen Carpenter', band: 'The Carpenters', born: 1950 },
23 | { name: 'Kurt Cobain', band: 'Nirvana', born: 1967 },
24 | { name: 'Chris Cornell', band: 'Soundgarden', born: 1964 },
25 | ];
26 |
27 | function pluck(list, propertyName) {
28 | ...
29 | }
30 |
31 | console.log( pluck(singers, 'name') );
32 | // ["Steven Tyler", "Karen Carpenter", "Kurt Cobain", "Chris Cornell"]
33 |
34 | console.log( pluck(singers, 'band') );
35 | // ["Aerosmith", "The Carpenters", "Nirvana", "Soundgarden"]
36 |
37 | console.log( pluck(singers, 'born') );
38 | // [1948, 1950, 1967, 1964]
39 | ```
40 |
41 |
42 | Solución
43 |
44 | ```javascript
45 | function pluck(list, propertyName) {
46 | var values = [];
47 |
48 | for (var i = 0; i < list.length; i++) {
49 | values.push( list[i][propertyName] );
50 | }
51 |
52 | return values;
53 | }
54 | ```
55 |
56 |
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 01`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Tipos de datos y operador `typeof`
6 |
7 | ### Objetivo
8 |
9 | Usaremos el operador `typeof` para distinguir los distintos tipos de datos de manera práctica.
10 |
11 | #### Requisitos
12 |
13 | Puedes hacer el siguiente ejemplo directo en la consola de Chrome.
14 |
15 | #### Desarrollo
16 |
17 | ```javascript
18 | // Numbers
19 | typeof 10; // "number"
20 | typeof 12.5; // "number"
21 | typeof 2.5e+6; // "number"
22 | typeof Infinity; // "number"
23 | typeof NaN; // "number"
24 |
25 | // Strings
26 | typeof ' '; // "string" - Espacios en blanco cuentan como caracteres
27 | typeof 'Hello World'; // "string"
28 | typeof '12'; // "string" - Números dentro de comillas son strings
29 |
30 | // Booleans
31 | typeof true; // "boolean"
32 | typeof false; // "boolean"
33 |
34 | // Undefined
35 | typeof undefined; // "undefined"
36 |
37 | var name;
38 | typeof name; // "undefined" - Aún no se asigna un valor
39 |
40 | // Null
41 | typeof Null; // "object"
42 | ```
43 | > Cuando usamos el operador `typeof` con `null` obtenemos como resultado `object` en lugar de `null`.
44 | Esto es considerado como un bug en JavaScript que está presente desde su creación, debido a que hay muchísimo código escrito tomando en cuenta este comportamiento, la idea de corregir este bug fue abandonada ya que causaría más problemas.
45 |
46 | 
47 |
--------------------------------------------------------------------------------
/Sesion-01/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 01`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Operadores
6 |
7 | ### Objetivo
8 |
9 | Practicar los distintos operadores básicos que proporciona JavaScript.
10 |
11 | #### Requisitos
12 |
13 | Puedes hacer el siguiente ejemplo directo en la consola de Chrome.
14 |
15 | #### Desarrollo
16 |
17 | ```javascript
18 | var a = 5;
19 | var b = 10;
20 | var c = 15;
21 |
22 | a + b; // 15
23 |
24 | b - a; // 5
25 |
26 | a * c; // 75
27 |
28 | c / a; // 3
29 |
30 | b % a; // 0
31 | ```
32 |
33 | 
34 |
35 | Este tipo de operaciones no cambia el valor de las variables `a`, `b` y `c` ya que no estamos usando el operador de asignación `=`. Sin embargo, los operadores de incremento y decremento sí cambian el valor de las variables.
36 |
37 | ```javascript
38 | var a = 5;
39 | var b = 10;
40 | var c = 15;
41 |
42 | c++; // 16
43 |
44 | b--; // 9
45 | ```
46 |
47 | 
48 |
49 | > Es bueno aclarar sobre la separación de cada línea en JavaScript con punto y coma `;`. JavaScript no requiere estrictamente usar puntos y comas al final de cada línea, sin embargo vale la pena colocarlos. Ahora, en algún punto, cuando alcances un mejor nivel, podrías considerarlos opcional mientras cumplas con ciertos criterios. [Te compartimos un artículo que habla sobre este tema.](https://flaviocopes.com/javascript-automatic-semicolon-insertion/)
50 |
--------------------------------------------------------------------------------
/Sesion-03/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Fibonacci
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los conceptos vistos hasta el momento de funciones y ciclos para solucionar un problema.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [reto 2](../Reto-02).
14 |
15 | #### Desarrollo
16 |
17 | En la serie de Fibonacci:
18 |
19 | `1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...`
20 |
21 | Cada elemento se obtiene sumando los dos valores anteriores.
22 |
23 | Completar la función `fibonacciSequence` la cuál recibe `limit`, un entero positivo que representa la cantidad de elementos de la serie que queremos.
24 |
25 | ```javascript
26 | function fibonacciSequence(limit) {
27 | ...
28 | }
29 | ```
30 |
31 | La función debe mostrar en consola los elementos de la serie hasta que `limit` sea alcanzado.
32 |
33 | ```javascript
34 | fibonacciSequence(1); // 1
35 | fibonacciSequence(2); // 1, 1
36 | fibonacciSequence(5); // 1, 1, 2, 3, 5
37 | ```
38 |
39 |
40 | Solución
41 |
42 | ```javascript
43 | function fibonacci(num) {
44 | if (num <= 1) return 1;
45 |
46 | return fibonacci(num - 1) + fibonacci(num - 2);
47 | }
48 |
49 | function fibonacciSequence(limit) {
50 | if(limit < 1) return console.log('Limit must be greater than 0');
51 |
52 | for(var i = 0; i < limit; i++ ) {
53 | console.log( fibonacci(i) );
54 | }
55 | }
56 | ```
57 |
58 |
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Usando `switch`
6 |
7 | ### Objetivo
8 |
9 | Analizar la sintaxis de `switch` y determinar en qué casos es mejor usarlo en lugar de `if`/`else`.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-2.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | Vamos a calcular el día de la semana dependiendode su valor númerico empezando en cero.
29 |
30 | ```javascript
31 | var day = 2;
32 | var text;
33 |
34 | switch (day) {
35 | case 0:
36 | text = "Sunday";
37 | break;
38 | case 1:
39 | text = "Monday";
40 | break;
41 | case 2:
42 | text = "Tuesday";
43 | break;
44 | case 3:
45 | text = "Wednesday";
46 | break;
47 | case 4:
48 | text = "Thursday";
49 | break;
50 | case 5:
51 | text = "Friday";
52 | break;
53 | case 6:
54 | text = "Saturday";
55 | break;
56 | default:
57 | text = "Error";
58 |
59 | }
60 |
61 | console.log(text); // Tuesday
62 | ```
63 |
64 | 
65 |
--------------------------------------------------------------------------------
/Sesion-02/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Operadores lógicos - if/else
6 |
7 | ### Objetivos
8 |
9 | Implementar adecuadamente los operadores lógicos necesarios para controlar el flujo del código.
10 |
11 | #### Requisitos
12 |
13 | Vamos a empezar con el último código generado en el [Ejemplo 01](../Ejemplo-01/):
14 |
15 | ```javascript
16 | var time = 13;
17 | var greeting;
18 |
19 | if (time < 12) {
20 | greeting = "Good morning";
21 | } else if (time < 20) {
22 | greeting = "Good afternoon";
23 | } else if (time >= 20) {
24 | greeting = "Good evening";
25 | }
26 |
27 | console.log(greeting) // Good afternoon
28 | ```
29 |
30 | #### Desarrollo
31 |
32 | Nuestro código tiene una pequeña falla, el día sólo tiene 24 horas y no se está tomando en cuenta el caso en el que `time` sea una hora inválida.
33 |
34 | Utilizando lo visto hasta el momento sobre operadores lógicos y condicionales, debes crear un nuevo mensaje que será usado cuando `time` sea una hora que no existe en el día.
35 |
36 |
37 | Solución
38 |
39 | ```javascript
40 | var time = 27;
41 | var greeting;
42 |
43 | if (time >= 0 && time < 12) {
44 | greeting = "Good morning";
45 | } else if (time >= 12 && time < 20) {
46 | greeting = "Good afternoon";
47 | } else if (time >= 20 && time < 24) {
48 | greeting = "Good evening";
49 | } else {
50 | greeting = "Unknown hour";
51 | }
52 |
53 | console.log(greeting) // Unknown hour
54 | ```
55 |
56 |
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Ciclo `for`
6 |
7 | ### Objetivo
8 |
9 | Analizar el funcionamiento de los ciclos o bucles para ejecutar código que queremos repetir `n` cantidad de veces.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-2.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | Pensemos que queremos repetir un texto 5 veces y que aparezca en consola:
29 |
30 |
31 | ```javascript
32 | console.log("Hello World");
33 | console.log("Hello World");
34 | console.log("Hello World");
35 | console.log("Hello World");
36 | console.log("Hello World");
37 | ```
38 |
39 | Excelente, funcionará y se reflejarán en la consola.
40 |
41 | Ahora bien, si te dijera que queremos repetirlo 200 veces, entonces copiar y pegar cada línea se volvería ineficiente (aparte de odiar al que te dio la instrucción).
42 |
43 | ¿Qué podemos hacer?
44 |
45 | ```javascript
46 | for(var i = 0; i<=200; i++){
47 | console.log("Hello World");
48 | }
49 | ```
50 |
51 | Con esto, obtendremos de retorno los 200 `"Hello World"`.
52 |
53 | 
54 |
--------------------------------------------------------------------------------
/Sesion-02/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Primeras condicionales
6 |
7 | ### Objetivo
8 |
9 | Implementar operadores lógicos y condicionales tipo `if`/`else`.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-2.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | Vamos a dar un saludo adecuado dependiendo de la hora.
29 |
30 | ```javascript
31 | var time = 13;
32 | var greeting;
33 |
34 | if (time < 12) {
35 | greeting = "Good morning";
36 | }
37 |
38 | if (time < 20) {
39 | greeting = "Good afternoon";
40 | }
41 |
42 | if (time >= 20) {
43 | greeting = "Good evening";
44 | }
45 |
46 | console.log(greeting) // Good afternoon
47 | ```
48 |
49 | 
50 |
51 | En lugar de tener distintos bloques con la condicional `if`, podemos concatenarlos todos con `else if`.
52 |
53 | ```javascript
54 | var time = 13;
55 | var greeting;
56 |
57 | if (time < 12) {
58 | greeting = "Good morning";
59 | } else if (time < 20) {
60 | greeting = "Good afternoon";
61 | } else if (time >= 20) {
62 | greeting = "Good evening";
63 | }
64 |
65 | console.log(greeting) // Good afternoon
66 | ```
67 |
68 | 
69 |
--------------------------------------------------------------------------------
/Sesion-05/Postwork/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Postwork`
2 |
3 | ---
4 |
5 | ## Postwork
6 |
7 | ### Objetivo
8 |
9 | Integrar function constructors e instanciamiento de objetos en el proyecto.
10 |
11 | #### Desarrollo
12 |
13 | Una ventaja más de crear un function constructor para `Task` es que nos permite agregar funciones en el prototype para que sean heredadas a todas las instancias. Un caso muy práctico sería para funciones que deban modificar propiedades del mismo objeto.
14 |
15 | ```javascript
16 | function toggleTaskCompleted(index) {
17 | tasks[index].isCompleted = !tasks[index].isCompleted;
18 | }
19 | ```
20 |
21 | La sesión anterior creamos la función `toggleTaskCompleted` para modificar la propiedad `isCompleted` de cualquier tarea en base a su posición en el arreglo. Podemos poner esta función en el prototype de `Task` de la siguiente manera:
22 |
23 | ```javascript
24 | var Task = function(description, isCompleted) {
25 | this.description = description;
26 | this.isCompleted = isCompleted;
27 | }
28 |
29 | Task.prototype.toggleCompleted = function() {
30 | this.isCompleted = !this.isCompleted;
31 | }
32 | ```
33 |
34 | Ahora todos los objetos creados a partir de `Task` tendrán acceso a esta función.
35 |
36 | ```javascript
37 | var tasks = [];
38 |
39 | function addTask(description, isCompleted = false) {
40 | tasks.push(new Task(description, isCompleted));
41 | }
42 |
43 | addTask('Some task to do');
44 |
45 | console.log(tasks[0]); // { description: 'Some...', isCompleted: false }
46 |
47 | tasks[0].toggleCompleted();
48 |
49 | console.log(tasks[0]); // { description: 'Some...', isCompleted: true }
50 | ```
51 |
52 | 
53 |
--------------------------------------------------------------------------------
/Sesion-05/Reto-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Reto 02`
2 |
3 | ---
4 |
5 | ## Reto 2: Group
6 |
7 | ### Objetivos
8 |
9 | Crear un constructor, agregar métodos al prototype e instanciar múltiples objetos a partir de dicho constructor.
10 |
11 | #### Requisitos
12 |
13 | Haber terminado el [Reto 1](../Reto-01/Readme.md).
14 |
15 | #### Desarrollo
16 |
17 | Crear un function constructor `Group` el cual crea una lista (arreglo) vacía.
18 |
19 | Agregar los siguientes métodos a `Group`:
20 |
21 | 1. `add`: Agrega un nuevo valor al grupo sólo si no existe.
22 |
23 | 2. `has`: Retorna un booleano indicando si el valor es un miembro del grupo.
24 |
25 | 3. `from`: Método estático que recibe un arreglo y crea un grupo con todos los elementos de dicho arreglo.
26 |
27 | ```javascript
28 | var Group = function() {
29 | ...
30 | }
31 |
32 | var group = Group.from([1, 2, 3, 4, 5]);
33 | console.log(group); // Group { members: [ 1, 2, 3, 4, 5 ] }
34 | console.log(group.has(5)); // true
35 | console.log(group.has(10)); // false
36 |
37 | group.add(10);
38 | console.log(group.has(10)); // true
39 | ```
40 |
41 |
42 | Solución
43 |
44 | ```javascript
45 | var Group = function() {
46 | this.members = [];
47 | }
48 |
49 | Group.prototype.add = function(value) {
50 | if (!this.has(value)) {
51 | this.members.push(value);
52 | }
53 | }
54 |
55 | Group.prototype.has = function(value) {
56 | return this.members.includes(value);
57 | }
58 |
59 | Group.from = function(collection) {
60 | var group = new Group();
61 |
62 | for(var i = 0; i < collection.length; i++) {
63 | group.add(collection[i]);
64 | }
65 | return group;
66 | }
67 | ```
68 |
69 |
70 |
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Expresión de Función
6 |
7 | ### Objetivo
8 |
9 | Analizar la diferencia entre declaración de función y expresión de función.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-3.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | Ya vimos cómo en las declaraciones de funciones comenzamos con `function` después el nombre y los argumentos de la función dentro de paréntesis.
29 |
30 | ```javascript
31 | function whatDoYouDo(job, name) {
32 | ...
33 | }
34 | ```
35 |
36 | La sintaxis cambia un poco en una expresión de función.
37 |
38 | ```javascript
39 | var whatDoYouDo = function(job, name) {
40 | switch (job) {
41 | case 'developer':
42 | return name + ' develops cool apps.';
43 | case 'designer':
44 | return name + ' designs awesome websites.';
45 | default:
46 | return name + ' does something else.'
47 | }
48 | }
49 |
50 | console.log(whatDoYouDo('developer', 'John Doe'));
51 | console.log(whatDoYouDo('designer', 'Jane Doe'));
52 | console.log(whatDoYouDo('retired', 'Mark Doe'));
53 | ```
54 | > No es necesario incluir `break` en cada caso del `switch` porque `return` finaliza la función, el siguiente código no es ejecutado.
55 |
56 | 
57 |
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Usando event object
6 |
7 | ### Objetivo
8 |
9 | Implementar propiedades del event object para manipular el DOM.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 2: Usando event object
19 |
20 |
21 |
Hello World!
22 |
23 |
24 |
25 |
28 |
29 |
30 | ```
31 |
32 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones anteriores.
33 |
34 | #### Desarrollo
35 |
36 | En el ejemplo anterior vimos como cambiar las propiedad de un nodo a través de event handlers. En este ejemplo vamos a usar la información contenida en el event object para manipular el DOM.
37 |
38 | ```javascript
39 | var title = document.getElementById('title');
40 |
41 | var input = document.getElementById('text');
42 | ```
43 |
44 | Ahora usaremos el método `addEventListener` para registrar un handler en el ``, el evento que queremos escuchar es `input`, el cual se dispara cuando hay un cambio en el nodo.
45 |
46 | ```javascript
47 | input.addEventListener("input", function(event) {
48 | title.textContent = event.target.value;
49 | });
50 | ```
51 |
52 | La propiedad `textContent` nos permite obtener o cambiar el contenido de texto de un nodo. La propiedad `target` del event object es una referencia al nodo que lanzó el evento, en este caso nuestro ``, por lo que podemos acceder al atributo `value` de ese elemento.
53 |
54 | 
55 |
--------------------------------------------------------------------------------
/Sesion-02/Reto-final/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 02`](../Readme.md) > `Reto Final`
2 |
3 | ---
4 |
5 | ## Reto Final
6 |
7 | ### Objetivo
8 |
9 | Realizar los mockups y la planeación del proyecto que se desarrollará a lo largo del módulo. También, reforzar conceptos utilizados en la sesión.
10 |
11 | #### Desarrollo
12 |
13 | Ahora que ya tienes definido cuál será tu proyecto debes comenzar la planeación. Tal vez consideres esta parte como un paso innecesario pero es bueno que te acostumbres a siempre hacerlo independientemente del tipo de proyectos que tengas, de esta forma te ahorrarás tiempo de desarrollo.
14 |
15 | Lo primero es hacer un mockup de la aplicación. Un mockup es un diseño digital de un sitio web y/o aplicación. Estos se utilizan en la fase de diseño inicial para visualizar ideas y conceptos en el contexto del diseño web e incluyen la estructura de navegación, el sitio y los elementos de diseño en detalle.
16 |
17 | Los mockups se utilizan para pruebas de usabilidad mucho antes de si quiera empezar a programar. De este modo, cualquier problema se detecta antes de crear el prototipo y se reduce el riesgo de que un concepto tenga que ser completamente revisado a mitad de la fase de desarrollo. Como se mencionó anteriormente, los mockups pueden contribuir a ahorrar tiempo y dinero en un proyecto.
18 |
19 | 
20 |
21 | No es necesario utilizar algún software, este bosquejo se puede realizar con papel y lápiz, y puede ser tan detallado o minimalista como gustes. El objetivo es plasmar en físico las ideas que tienes sobre cómo debe verse y qué quieres que haga.
22 |
23 | Incluso puedes crear varios mockups para simular la interación del usuario con la aplicación, es decir, puedes crear distintas vistas de la aplicación que se muestran cuando un usuario hace click en algún botón en específico o cuando llena un formulario.
24 |
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: IIFE
6 |
7 | ### Objetivo
8 |
9 | Evaluar otra forma de utilizar expresiones de función al ejecutarlas inmediatamente.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-3.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | Supongamos que tenemos una función que muestra en consola un nombre cualquiera.
29 |
30 | ```javascript
31 | function logName() {
32 | var name = "John Doe";
33 | console.log(name);
34 | }
35 |
36 | logName(); // John Doe
37 | ```
38 |
39 | 
40 |
41 | Para convertir esta función en una IIFE debemos envolver toda la función en paréntesis, eso lo hace una expresión, posteriormente usamos `()` para ejecutar la función justo después de ser definida.
42 |
43 | ```javascript
44 | (function() {
45 | var name = "John Doe";
46 | console.log(name);
47 | })();
48 | ```
49 |
50 | 
51 |
52 | Como ya fue ejecutada y es anónima, no hay forma de que podamos volver a llamar la función de nuevo.
53 |
54 | También se pueden pasar argumentos a este tipo de funciones, de la misma forma que lo hacemos con las funciones normales.
55 |
56 | ```javascript
57 | (function(lastName) {
58 | var firstName = "John";
59 | console.log(firstName + ' ' + lastName);
60 | })('Doe');
61 | ```
62 |
63 | 
64 |
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Eventos en nodos del DOM
6 |
7 | ### Objetivo
8 |
9 | Agregar event handlers a distintos nodos.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 1: Eventos en nodos del DOM
19 |
20 |
21 |
Hello World
22 |
23 |
24 |
25 |
26 |
27 |
30 |
31 |
32 | ```
33 |
34 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones anteriores.
35 |
36 | #### Desarrollo
37 |
38 | En este ejemplo vamos a cambiar el color del título agregando event handlers a todos los botones del documento. Tanto el título como los botones cuentan con un id único por lo que podemos usar `getElementById`.
39 |
40 | ```javascript
41 | var title = document.getElementById('title');
42 |
43 | var redButton = document.getElementById('red');
44 |
45 | var blueButton = document.getElementById('blue');
46 |
47 | var blackButton = document.getElementById('black');
48 | ```
49 |
50 | Ahora usaremos el método `addEventListener` para registrar un handler a cada botón. El cambio de color lo haremos asignando la propiedad `style` del nodo `title`.
51 |
52 | ```javascript
53 | redButton.addEventListener("click", function() {
54 | title.style = "color: red;";
55 | });
56 |
57 | blueButton.addEventListener("click", function() {
58 | title.style = "color: blue;";
59 | });
60 |
61 | blackButton.addEventListener("click", function() {
62 | title.style = "color: black;";
63 | });
64 | ```
65 |
66 | 
67 |
--------------------------------------------------------------------------------
/Sesion-01/Postwork/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../Readme.md) > [`Sesión 01`](../Readme.md) > `Postwork`
2 |
3 | ---
4 |
5 | ## Postwork
6 |
7 | ### Objetivo
8 |
9 | Definir el proyecto que se desarrollará a lo largo del módulo.
10 |
11 | #### Desarrollo
12 |
13 | Una vez tengas definido lo que quieres realizar debes escoger un nombre para el proyecto y crear un repositorio en **GitHub** para alojar el proyecto y llevar un control en sus versiones.
14 |
15 | Después de iniciar sesión, en la esquina superior derecha encontrarás un menú desplegable con la opción **Nuevo repositorio**
16 |
17 | .
18 |
19 | El nombre del repositorio debe ser en minúsculas, con guiones en lugar de espacios y sin caracteres especiales. Por ejemplo: *hello-world*.
20 |
21 | 
22 |
23 | La descripción debe ser breve e incluir a grandes rasgos de qué trata el proyecto. Por ejemplo: *Aplicación para crear recordatorios*.
24 |
25 | 
26 |
27 | Selecciona el repositorio como público.
28 |
29 | 
30 |
31 | Selecciona **Inicializar este repositorio con un README**.
32 |
33 | 
34 |
35 | Finalmente haz click en **Crear repositorio**.
36 |
37 | #### Opcional
38 |
39 | Para reforzar lo visto en clase se recomienda leer la [introducción](https://eloquentjavascript.net/00_intro.html) (historia de JavaScript) y el [capítulo 1](https://eloquentjavascript.net/01_values.html) (variables, tipos de datos y operadores) del siguiente libro interactivo:
40 |
41 | **[Eloquent JavaScript](https://eloquentjavascript.net/)**
42 |
--------------------------------------------------------------------------------
/Sesion-05/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Vectores
6 |
7 | ### Objetivos
8 |
9 | Crear un constructor, agregar métodos al prototype e instanciar múltiples objetos a partir de dicho constructor.
10 |
11 | #### Requisitos
12 |
13 | `N/A`
14 |
15 | #### Desarrollo
16 |
17 | Crear un function constructor `Vec` el cual representa un vector en dos dimensiones. Recibe dos parámetros `x` y `y`, ambos valores numéricos que deben ser las propiedades del objeto.
18 |
19 | Agregar los siguientes métodos al `prototype` de `Vec`:
20 |
21 | 1. `plus`: Recibe otro vector como parámetro y retorna un nuevo vector con la suma de ambos vectores.
22 |
23 | 2. `minus`: Recibe otro vector como parámetro y retorna un nuevo vector con la diferencia de ambos vectores.
24 |
25 | 3. `length`: Retorna la longitud del vector, es decir, la distancia del punto _(x, y)_ desde el origen _(0, 0)_.
26 |
27 | ```javascript
28 | var Vec = function(x, y) {
29 | ...
30 | }
31 |
32 | var vec1 = new Vec(1, 2);
33 | var vec2 = new Vec(2, 3);
34 |
35 | console.log(vec1.plus(vec2)); // Vec { x: 3, y: 5 }
36 | console.log(vec1.minus(vec2)); // Vec { x: -1, y: -1 }
37 | console.log(vec1.length()); // 2.23606797749979
38 | ```
39 |
40 | > Para calcular la distancia desde (0, 0) hasta (x, y) se puede usar el teorema de Pitágoras: √(x2 + y2). En JavaScript existe el método `Math.sqrt` para calcular raíces cuadradas.
41 |
42 |
43 | Solución
44 |
45 | ```javascript
46 | var Vec = function(x, y) {
47 | this.x = x;
48 | this.y = y;
49 | }
50 |
51 | Vec.prototype.plus = function(other) {
52 | return new Vec(this.x + other.x, this.y + other.y);
53 | }
54 |
55 | Vec.prototype.minus = function(other) {
56 | return new Vec(this.x - other.x, this.y - other.y);
57 | }
58 |
59 | Vec.prototype.length = function() {
60 | return Math.sqrt(this.x * this.x + this.y * this.y);
61 | }
62 | ```
63 |
64 |
65 |
--------------------------------------------------------------------------------
/Sesion-08/Reto-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Reto 01`
2 |
3 | ---
4 |
5 | ## Reto 1: Inflar un globo
6 |
7 | ### Objetivos
8 |
9 | Crear event handlers y usar el event object para determinar las teclas presionadas.
10 |
11 | #### Requisitos
12 |
13 | Partir del siguiente documento HTML:
14 |
15 | ```html
16 |
17 |
18 |
19 | Reto 1: Inflar un globo
20 |
21 |
22 |
23 |
🎈
24 |
25 |
28 |
29 |
30 | ```
31 |
32 | #### Desarrollo
33 |
34 | En este reto el globo (🎈) debe inflarse (aumentar su tamaño) un 10% al presionar la flecha hacia arriba y desinflarse (disminuir su tamaño) un 10% el presionar la flecha hacia abajo.
35 |
36 | Los emojis son considerados como texto por lo que puedes controlar el tamaño con la propiedad de CSS `font-size`. El valor inicial debe ser de `20px`.
37 |
38 | Los nombres de las teclas de flecha que necesitas son `ArrowUp` y `ArrowDown`. Con el método `preventDefault()` podemos evitar que la página haga un scroll al presionar estas teclas.
39 |
40 | Por último, si el tamaño del globo es mayor a `80px` se debe reemplazar por el emoji 💥 y eliminar el event handler.
41 |
42 |
43 | Solución
44 |
45 | ```javascript
46 | var p = document.querySelector("p");
47 | var size;
48 |
49 | function setSize(newSize) {
50 | size = newSize;
51 | p.style.fontSize = size + "px";
52 | }
53 |
54 | setSize(20);
55 |
56 | function handleArrow(event) {
57 | if (event.key == "ArrowUp") {
58 | if (size > 80) {
59 | p.textContent = "💥";
60 | document.body.removeEventListener("keydown", handleArrow);
61 | } else {
62 | setSize(size * 1.1);
63 | event.preventDefault();
64 | }
65 | } else if (event.key == "ArrowDown") {
66 | setSize(size * 0.9);
67 | event.preventDefault();
68 | }
69 | }
70 |
71 | document.body.addEventListener("keydown", handleArrow);
72 | ```
73 |
74 |
75 |
--------------------------------------------------------------------------------
/Sesion-02/Postwork/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../Readme.md) > [`Sesión 02`](../Readme.md) > `Postwork`
2 |
3 | ---
4 |
5 | ## Postwork
6 |
7 | ### Objetivo
8 |
9 | Realizar los mockups y la planeación del proyecto que se desarrollará a lo largo del módulo. También, reforzar conceptos utilizados en la sesión.
10 |
11 | #### Desarrollo
12 |
13 | Lo siguiente que puedes hacer es crear user stories. Los user stories son descripciones pequeñas y simples de una funcionalidad o feature desde el punto de vista de la persona que va a hacer uso de dicho feature. Normalmente esa persona es el usuario final, pero también puede ser alguien con rol de administrador o permisos especiales.
14 |
15 | Se pueden escribir de la siguiente manera:
16 |
17 | ```
18 | Como , quiero para
19 | ```
20 |
21 | Algunos ejemplos para el Todo App podrían ser:
22 |
23 | - Como usuario quiero agregar nuevas tareas a la lista.
24 | - Como usuario quiero marcar una tarea como completada.
25 | - Como usuario quiero eliminar una tarea para que no utilice espacio.
26 | - Como usuario quiero filtrar tareas completadas o no completadas.
27 | - Como usuario quiero buscar una tarea específica.
28 | - Como usuario quiero scrollear cuando la lista es muy larga.
29 |
30 | 
31 |
32 | Con esto tenemos una lista de features que queremos en nuestra aplicación. Ahora podemos decidir cuáles son obligatorias tener en nuestra aplicación y cuáles podemos dejar para después e incluir como mejoras de la aplicación.
33 |
34 |
35 | #### Opcional
36 |
37 | Para reforzar lo visto en clase se recomienda leer el [capítulo 2](https://eloquentjavascript.net/02_program_structure.html) del siguiente libro interactivo:
38 |
39 | **[Eloquent JavaScript](https://eloquentjavascript.net/)**
40 |
41 | En este capítulo encontrarás más información sobre el control de flujo de una aplicación mediante el uso de condicionales y blucles, también vienen convenciones comunes para nombrar variables y al final del capítulo verás 3 ejercicios que puedes resolver desde la página.
42 |
--------------------------------------------------------------------------------
/Sesion-07/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 07`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Cambiando el DOM
6 |
7 | ### Objetivo
8 |
9 | Modificar el DOM agregando nodos hijos a un elemento.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 2: Cambiando el DOM
19 |
20 |
21 |
One
22 |
Two
23 |
Three
24 |
25 |
28 |
29 |
30 | ```
31 |
32 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones anteriores.
33 |
34 | #### Desarrollo
35 |
36 | En este ejemplo vamos a ver cómo cambiar la estructura del DOM. Lo primero es seleccionar todas las etiquetas `p` del documento, esto lo podemos lograr con el método `getElementsByTagName`.
37 |
38 | ```javascript
39 | var paragraphs = document.body.getElementsByTagName("p");
40 |
41 | console.log('Colección de nodos: ', paragraphs);
42 |
43 | console.log('Primer nodo: ', paragraphs[0]);
44 | console.log('Segundo nodo: ', paragraphs[1]);
45 | console.log('Tercer nodo: ', paragraphs[2]);
46 | ```
47 |
48 | Podemos ver en consola que `paragraphs` representa una colección con las tres etiquetas `p` de nuestro documento.
49 |
50 | 
51 |
52 | Vamos a cambiar el orden de estos nodos con el método `insertBefore`, el cual recibe dos argumentos, el primero es el nodo a insertar justo antes del nodo proporcionado como segundo argumento.
53 |
54 | 
55 |
56 | Al abrir la página vemos que el órden de los párrafos cambia. Un nodo puede existir en el documento en un sólo lugar a la vez, por lo que al insertar `Three` antes de `One` primero se elimina del final de la lista para insertarse al principio. **Todas las operaciones que impliquen insertar nodos tienen como efecto secundario la eliminación del nodo en la posición actual** si es que ya existe en el DOM.
57 |
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-02/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Ejemplo 02`
2 |
3 | ---
4 |
5 | ## Ejemplo 2: Transformando objetos en arreglos
6 |
7 | ### Objetivo
8 |
9 | Distinguir la sintaxis y correcta implementación de los arreglos en JavaScript.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-4.js` que es donde
24 | se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html`
25 | en Chrome e inspecciona la consola para ver los resultados.
26 |
27 |
28 | #### Desarrollo
29 |
30 | Vamos a crear una función que convierta un objeto en un arreglo con los pares
31 | `[key, value]` por cada propiedad.
32 |
33 | ```javascript
34 | var car = {
35 | brand: 'Nissan',
36 | model: 'Versa',
37 | year: 2020
38 | }
39 |
40 | [['brand', 'Nissan'], ['model', 'Versa'], ['year', 2020]] // Resultado esperado
41 | ```
42 |
43 | Para resolver este ejercicio haremos uso del método [`Object.keys()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) el cual retorna un arreglo con el nombre de las propiedades de un objeto.
44 |
45 | ```javascript
46 | var obj = {
47 | a: 'some string',
48 | b: 42,
49 | c: false
50 | };
51 |
52 | console.log( Object.keys(obj) ); // ['a', 'b', 'c']
53 | ```
54 |
55 | Después usaremos un ciclo para ir recorriendo todas las propiedades del objeto e ir obteniendo sus respectivos valores.
56 |
57 | ```javascript
58 | function keyValuePairs(obj) {
59 | var keys = Object.keys(obj);
60 | var pairs = [];
61 |
62 | for(var i = 0; i < keys.length; i++) {
63 | pairs.push( [keys[i], obj[keys[i]]] )
64 | }
65 |
66 | return pairs;
67 | }
68 | ```
69 |
70 | > El método `push()` agrega un nuevo elemento al final de un arreglo.
71 |
72 | ```javascript
73 | var result = keyValuePairs(car);
74 |
75 | console.log(result);
76 |
77 | // [['brand', 'Nissan'], ['model', 'Versa'], ['year', 2020]]
78 | ```
79 |
80 | 
81 |
--------------------------------------------------------------------------------
/Sesion-08/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Ejemplo 03`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Key events
6 |
7 | ### Objetivo
8 |
9 | Determinar las teclas presionadas al disparar un evento.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 | Ejemplo 3: Key events
19 |
20 |
21 |
22 |
Press Enter to turn this page blue.
23 |
Press Ctrl + Enter to turn this page orange.
24 |
25 |
28 |
29 |
30 | ```
31 |
32 | Opcionalmente se puede manejar el código de JavaScript en un archivo independiente como se ha trabajado en sesiones anteriores.
33 |
34 | #### Desarrollo
35 |
36 | En este ejemplo vamos a ver cómo realizar un cambio en el DOM al presionar una tecla o combinación de teclas. Agregaremos un event handler a la global `window` de tipo `keydown` que se ejecuta al presionar una tecla.
37 |
38 | ```javascript
39 | window.addEventListener("keydown", function(event) {
40 | if (event.key == "Enter") {
41 | document.body.style.background = "lightblue";
42 | }
43 |
44 | if (event.key == "Enter" && event.ctrlKey) {
45 | document.body.style.background = "orange";
46 | }
47 | });
48 | ```
49 |
50 | Estamos leyendo dos propiedades del event object, la primera es `key` que nos dice qué tecla fue presionada. La segunda propiedad que nos interesa es `ctrlKey` que nos ayuda a determinar si la tecla `ctrl` estuvo presionada cuando se lanzó el evento. Vamos a cambiar el color de fondo del documento, si se presiona solamente la tecla `Enter` el color será azul, pero si se presiona la combinación de teclas `Ctrl + Enter` entonces el color será naraja.
51 |
52 | ```javascript
53 | window.addEventListener("keyup", function(event) {
54 | if (event.key == "Enter") {
55 | document.body.style.background = "";
56 | }
57 | });
58 | ```
59 |
60 | Por último, necesitamos regresar al color por default cuando las teclas fueron soltadas, para eso utilizamos el evento `keyup` y verificamos que la tecla que se soltó es la misma que cambia el color, es decir, la tecla `Enter`.
61 |
62 | 
63 |
--------------------------------------------------------------------------------
/Sesion-04/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 04`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Arreglos
6 |
7 | ### Objetivo
8 |
9 | Distinguir la sintaxis y correcta implementación de los arreglos en JavaScript.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-4.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | Vamos a crear una función que reciba como argumento un arreglo con _n_ cantidad de enteros, dicha función debe retornar un nuevo arreglo con todos los elementos del primer arreglo multiplicados por dos.
29 |
30 | ```javascript
31 | [1, 3, 4, 7, 2, 1, 9, 0] // Arreglo inicial
32 |
33 | [2, 6, 8, 14, 4, 2, 18, 0] // Resultado esperado
34 | ```
35 |
36 | Una forma de resolverlo es recorriendo cada elemento del arreglo con un ciclo `for`, multiplicando el número por dos y guardándalo en un nuevo arreglo para retornarlo al final.
37 |
38 | ```javascript
39 | function multiplyByTwo(numbers) {
40 | var multipliedNumbers = [];
41 |
42 | for(var i = 0; i < numbers.length; i++) {
43 | multipliedNumbers.push(numbers[i] * 2);
44 | }
45 |
46 | return multipliedNumbers;
47 | }
48 | ```
49 |
50 | > El método `push()` agrega un nuevo elemento al final de un arreglo.
51 |
52 | Como estamos comparando que `i < numbers.length` el ciclo va a terminar con el último elemento del arreglo.
53 |
54 | ```javascript
55 | function multiplyByTwo(numbers) {
56 | var multipliedNumbers = [];
57 |
58 | for(var i = 0; i < numbers.length; i++) {
59 | multipliedNumbers.push(numbers[i] * 2);
60 | }
61 |
62 | return multipliedNumbers;
63 | }
64 |
65 | var input = [1, 3, 4, 7, 2, 1, 9, 0];
66 |
67 | var output = multiplyByTwo(input);
68 |
69 | console.log(input); // [1, 3, 4, 7, 2, 1, 9, 0]
70 | console.log(output); // [2, 6, 8, 14, 4, 2, 18, 0]
71 | ```
72 |
73 | 
74 |
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 3: Heredando métodos
6 |
7 | ### Objetivo
8 |
9 | Crear constructores para instanciar objetos y heredar métodos.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-5.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | En el [Ejemplo 1](../Ejemplo-01) creamos el siguiente constructor:
29 |
30 | ```javascript
31 | var Person = function(name, birthYear, job) {
32 | this.name = name;
33 | this.birthYear = birthYear;
34 | this.job = job;
35 | }
36 | ```
37 |
38 | Vamos a agregar un método `calculateAge()` similar al que hicimos la sesión anterior, pero no lo vamos a poner en el constructor, en su lugar lo vamos a crear dentro del prototype.
39 |
40 | ```javascript
41 | Person.prototype.calculateAge = function() {
42 | var today = new Date();
43 | var year = today.getFullYear();
44 |
45 | console.log( year - this.birthYear );
46 | }
47 | ```
48 |
49 | Ahora vamos a crear múltiples instancias de `Person`.
50 |
51 | ```javascript
52 | var john = new Person('John', 1990, 'Developer');
53 |
54 | var mark = new Person('Mark', 1985, 'Teacher');
55 |
56 | var jane = new Person('Jane', 1975, 'Designer');
57 | ```
58 |
59 | Si inspeccionamos en consola estos tres objetos nos damos cuenta que ninguno de ellos tiene el método `calculateAge()`.
60 |
61 | 
62 |
63 | Aún así podemos llamar `calculateAge()` en los tres objetos.
64 |
65 | ```javascript
66 | john.calculateAge();
67 |
68 | mark.calculateAge();
69 |
70 | jane.calculateAge();
71 | ```
72 |
73 | 
74 |
75 | Si inspeccionamos más a detalle estos objetos podemos encontrar el método `calculateAge()` dentro de `__proto__` que es el prototype del objeto. Incluso nos muestra cuál es el contructor del que fue instanciado. De hecho, podemos inspeccionar todo el prototype chain.
76 |
77 | 
78 |
--------------------------------------------------------------------------------
/Sesion-05/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Function constructor
6 |
7 | ### Objetivo
8 |
9 | Crear constructores para instanciar objetos.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-5.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | Ya mencionamos que podemos usar un constructor para crear múltiples objetos como:
29 |
30 | ```javascript
31 | var john = {
32 | name: 'John',
33 | birthYear: 1990,
34 | job: 'Developer'
35 | }
36 | ```
37 |
38 | La forma más común de hacer esto es mediante un `function constructor`, el cuál es una expresión de función como la siguiente:
39 |
40 | ```javascript
41 | var Person = function(name, birthYear, job) {
42 | this.name = name;
43 | this.birthYear = birthYear;
44 | this.job = job;
45 | }
46 | ```
47 |
48 | > Cuando estamos creando constructores una convención es nombrarlas con la primera letra mayúscula para diferenciar el constructor de las instancias.
49 |
50 | Vemos que este constructor recibe tres argumentos los cuáles son las propiedades que queremos que tenga nuestro objeto.
51 |
52 | ```javascript
53 | var john = new Person('John', 1990, 'Developer');
54 | ```
55 |
56 | El operador `new` crea un nuevo objeto vacío, después se ejecuta la función `Person()`, esta es la razón por la que el constructor utiliza `this`, está haciendo referencia al nuevo objeto vacío para asignarle las propiedades.
57 |
58 | ```javascript
59 | console.log( john );
60 | /*
61 | * {
62 | * name: 'John',
63 | * birthYear: 1990,
64 | * job: 'Developer'
65 | * }
66 | */
67 | ```
68 |
69 | Hemos creado un objeto `john` el cuál es una instancia del constructor `Person`.
70 |
71 | 
72 |
73 | De esta manera podemos crear todas las instancias que sean necesarias a partir del mismo construcor.
74 |
75 | ```javascript
76 | var mark = new Person('Mark', 1985, 'Teacher');
77 |
78 | var jane = new Person('Jane', 1975, 'Designer');
79 | ```
80 |
81 | 
82 |
--------------------------------------------------------------------------------
/Sesion-03/Ejemplo-01/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 03`](../Readme.md) > `Ejemplo 01`
2 |
3 | ---
4 |
5 | ## Ejemplo 1: Funciones
6 |
7 | ### Objetivo
8 |
9 | Distinguir la sintaxis de las funciones y su correcta implementación.
10 |
11 | #### Requisitos
12 |
13 | En una nueva carpeta vamos a crear un archivo `HTML` en blanco llamado `index.html`:
14 |
15 | ```html
16 |
17 |
18 |
19 |
20 |
21 | ```
22 |
23 | Dentro de la misma carpeta creamos un archivo `ejemplos-sesion-3.js` que es donde se trabajarán los ejemplos de esta sesión. Finalmente abre el archivo `index.html` en Chrome e inspecciona la consola para ver los resultados.
24 |
25 |
26 | #### Desarrollo
27 |
28 | Vamos a dar calcular la edad mediante una función que reciba el año de nacimiento.
29 |
30 | ```javascript
31 | function calculateAge(birthYear) {
32 | var age = 2020 - birthYear;
33 | return age;
34 | }
35 | ```
36 |
37 | Cuando vemos `return` en una función significa que va a retornar un valor al final de la ejecución de la función. Este valor puede ser guardado en una variable.
38 |
39 | ```javascript
40 | var ageJohn = calculateAge(1995);
41 | ```
42 |
43 | Para ejecutar una función colocamos el nombre de la función seguido de `()` con los argumentos necesarios. En este ejemplo la variable `ageJohn` contiene el resultado que retorne `calculateAge()`.
44 |
45 | ```javascript
46 | function calculateAge(birthYear) {
47 | var age = 2020 - birthYear;
48 | return age;
49 | }
50 |
51 | var ageJohn = calculateAge(1995);
52 |
53 | console.log(ageJohn); // 25
54 | ```
55 |
56 | 
57 |
58 | Ahora podemos llamar la misma función las veces que queramos sin necesidad de repetir las mismas líneas de código una y otra vez. Las funciones también pueden llamar a otras funciones.
59 |
60 | ```javascript
61 | function yearsUntilRetirement(year, name) {
62 | var age = calculateAge(year);
63 | var retirement = 65 - age;
64 | console.log(name + ' retires in ' + retirement + ' years.');
65 | }
66 | ```
67 |
68 | Algunas funciones no retornan valor alguno, como `yearsUntilRetirement` qué sólo muestra un mensaje en consola. En este caso no podemos guardar el resultado en una variable como hicimos con `ageJohn`.
69 |
70 | ```javascript
71 | yearsUntilRetirement(1995, 'John Doe');
72 | // John Doe retires in 40 years.
73 | ```
74 |
75 | 
76 |
--------------------------------------------------------------------------------
/Sesion-05/Reto-final/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 05`](../Readme.md) > `Reto Final`
2 |
3 | ---
4 |
5 | ## Reto Final
6 |
7 | ### Objetivo
8 |
9 | Integrar function constructors e instanciamiento de objetos en el proyecto.
10 |
11 | #### Desarrollo
12 |
13 | Ya vimos cómo podemos instanciar múltiples objetos a partir de un constructor para evitar repetir el mismo código una y otra vez, ahora podemos implementar la misma lógica en el proyecto.
14 |
15 | Siguiendo el ejemplo de la aplicación para crear tareas, pasamos de tener múltiples variables como las siguientes:
16 |
17 | ```javascript
18 | var task1 = {
19 | description: 'Some task to do',
20 | isCompleted: false
21 | }
22 |
23 | var task2 = {
24 | description: 'Another task to do',
25 | isCompleted: false
26 | }
27 |
28 | var task3 = {
29 | description: 'One more task to do',
30 | isCompleted: false
31 | }
32 | ```
33 |
34 | A guardar todos los objetos dentro de un arreglo:
35 |
36 | ```javascript
37 | var tasks = [
38 | {
39 | description: 'Some task to do',
40 | isCompleted: false
41 | },
42 | {
43 | description: 'Another task to do',
44 | isCompleted: false
45 | },
46 | {
47 | description: 'One more task to do',
48 | isCompleted: false
49 | }
50 | ]
51 | ```
52 |
53 | Para implementar los conceptos de programación orientada a objetos vistos hasta ahora, vamos crear un function constructor `Task` e instanciar los tasks que irán dentro del arreglo `tasks`.
54 |
55 | ```javascript
56 | var Task = function(description, isCompleted) {
57 | this.description = description;
58 | this.isCompleted = isCompleted;
59 | }
60 | ```
61 |
62 | Con esto podemos instanciar nuevos objetos a partir de `Task`. Para ello vamos a crear una función que se encargará de agregar una nueva tarea al arreglo que inicialmente se encontrará vacío.
63 |
64 | ```javascript
65 | var tasks = [];
66 |
67 | function addTask(description, isCompleted = false) {
68 | tasks.push(new Task(description, isCompleted));
69 | }
70 | ```
71 |
72 | En JavaScript podemos asignar un valor por default a los parámetros de una función. Esto significa que si no pasamos un valor para `isCompleted` la función le asignará `false` por default, por lo que sólo debemos pasarle `description` a la función al menos que queramos crear una tarea ya completada.
73 |
74 | ```javascript
75 | addTask('Some task to do');
76 |
77 | console.log(tasks[0]); // { description: 'Some...', isCompleted: false }
78 |
79 | addTask('Completed task', true);
80 |
81 | console.log(tasks[1]); // { description: 'Completed...', isCompleted: true }
82 | ```
83 |
84 | 
85 |
--------------------------------------------------------------------------------
/Sesion-08/Reto-03/Readme.md:
--------------------------------------------------------------------------------
1 | [`Programación con JavaScript`](../../Readme.md) > [`Sesión 08`](../Readme.md) > `Reto 03`
2 |
3 | ---
4 |
5 | ## Reto 3: Navegando entre tabs
6 |
7 | ### Objetivos
8 |
9 | Implementar event handlers para crear tabs de navegación.
10 |
11 | #### Requisitos
12 |
13 | Partir del siguiente documento HTML:
14 |
15 | ```html
16 |
17 |
18 |
19 | Reto 3: Navegando entre tabs
20 |
21 |
22 |
23 |
24 |
Tab one
25 |
Tab two
26 |
Tab three
27 |
28 |
29 |
34 |
35 |
36 | ```
37 |
38 | #### Desarrollo
39 |
40 | Crear una función `createTabs` que recibe un nodo del DOM y genera una interfaz de tabs de navegación.
41 |
42 | La función debe insertar una lista de elementos `